煎饼(Stacks of Flapjacks,UVa 120)
2015-11-26 20:46
411 查看
原题链接
原文链接
分析:思路很简单,设目前查找位置为k,设(k+1--n)已满足题意,那么在1--k中寻找最大的元素并记录其位置为i,则有三种情况:
1):若i==k,继续判断位置k-1。
2):若i==1,翻转1--k,继续判断位置k-1;
3):翻转1--i,使位置1为最大元素,执行 2)。
自己写了程序,但一直WA,参考了网上的代码,(⊙v⊙)嗯。。。。。还是太菜了~~~~(>_<)~~~~
原文代码(STL的魅力啊...):
原文链接
分析:思路很简单,设目前查找位置为k,设(k+1--n)已满足题意,那么在1--k中寻找最大的元素并记录其位置为i,则有三种情况:
1):若i==k,继续判断位置k-1。
2):若i==1,翻转1--k,继续判断位置k-1;
3):翻转1--i,使位置1为最大元素,执行 2)。
自己写了程序,但一直WA,参考了网上的代码,(⊙v⊙)嗯。。。。。还是太菜了~~~~(>_<)~~~~
原文代码(STL的魅力啊...):
#include <algorithm> #include <iostream> #include <iterator> #include <deque> #include <string> #include <sstream> using namespace std; //主函数 int main(void) { //循环处理输入的每组字符串。每次循环一轮要输出最后的0和换行 for (string strLine; getline(cin, strLine); cout << '0' << endl) { //按要求回应输入的字符串行 cout << strLine << endl; //构造字符串流,以遍转换为数字 istringstream iss(strLine); //将字符串转为数字,逆序(最底的在最前)存储在Stack里 deque<int> Stack; for (int nDiam; iss >> nDiam; Stack.push_front(nDiam)); //从底依次上向进行翻转,保持i上面的都比i小 for (deque<int>::iterator i = Stack.begin(); i != Stack.end(); ++i) { //找出i上面(包括i)的最大元素 deque<int>::iterator iMax = max_element(i, Stack.end()); //如果最大元素就是i则继续(将i指向上面一个) if (iMax != i) { //否则要进行需翻转操作 //如果最大的不在最上面,则需先翻转到最上面 if (iMax != Stack.end() - 1) { reverse(iMax, Stack.end()); //输出翻转的起点 cout << distance(Stack.begin(), iMax) + 1 << ' '; } //将最大的从最上面翻转到i的位置上 reverse(i, Stack.end()); //输出翻转的起点 cout << distance(Stack.begin(), i) + 1 << ' '; } } } return 0; }自己的WA代码。。。。
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<string> #include<map> #include<cmath> #include<sstream> #include<deque> #include<queue> #include<cctype> using namespace std; typedef long long ll; #define MAX 205 int main() { char str[1000]; int n; int num[500]; int num2[500]; while(gets(str)) { puts(str); n = 0; memset(num,0,sizeof(num)); for(int i=0;str[i];i++) if(str[i] != ' ') num[n++] = str[i] - '0'; memcpy(num2,num,sizeof(num)); sort(num2,num2+n); int k = n; while(k) { int i; for(i=k;i>0;i--) if(num[i-1] == num2[k-1]) break; if( i != k) { if(i != 1) { for(int j=0;j<i/2;j++) swap(num[j],num[i-1-j]); printf("%d ",n - i + 1); } 4000 for(int j=0;j<k/2;j++) swap(num[j],num[k-1-j]); printf("%d ",n - k + 1); } k--; } printf("0\n"); } return 0; }有时间再仔细找找吧。。。。
相关文章推荐
- Kd-Tree算法
- 汇编语言程序开发过程
- [笔记-架构探险]web服务框架-cxf-4.1.多种方式的发布与客户端调用
- 杭电oj 1005
- <14> go strings_func
- iOS UIWebView与JS交互
- ReactNativeiOS(二)读书记录 4布局实战
- Android adb.exe链接中断 The connection to adb is down, and a severe error has occured.
- Delphi获取系统服务描述信息
- qt绘图相关的基础知识
- 【程序设计基础_C语言】北理工的恶龙
- Android中防止重复点击的小技巧
- Android asset raw 文件夹的区别深入解析
- 黑马程序员--如何使用API
- OC第一天
- Triangle
- HD_2037今年暑假不AC
- Delphi利用Webbrowser登陆QQ群文档
- C语言基础第三篇--控制语句
- 错误:Unsupported major.minor version 51.0(jdk版本错误)