博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVa 120 煎饼
阅读量:5162 次
发布时间:2019-06-13

本文共 1914 字,大约阅读时间需要 6 分钟。

题意:颠倒连续子序列,使之成为升序。

思路:按照从大到小的顺序,依次选择出一个数字进行分析:

        ①如果该数字已经在正确的位置上,则不用管。

        ②如果该数字已经在最顶端,则从它该在的位置一直到顶端颠倒。

        ③如果该数字不在最顶端,则应先把它搞到最顶端,再从它该在的位置一直到顶端颠倒。

1 #include
2 #include
3 #include
4 #include
5 #include
6 using namespace std; 7 8 const int maxn = 35; 9 int ans[maxn];10 int coo[maxn];11 int coo2[maxn];12 int path[1000];13 int k;14 int num;15 16 string line;17 18 bool cmp(int a, int b)19 {20 return a > b;21 }22 23 void convert(int t) //颠倒连续子序列24 {25 memcpy(coo2, ans, sizeof(ans));26 for (int i = 1; i <= t; i++)27 {28 ans[i] = coo2[t - i + 1]; 29 }30 }31 32 void solve()33 {34 memcpy(coo, ans, sizeof(ans));35 num = 0;36 sort(coo + 1, coo + k + 1, cmp);37 for (int i = 1; i <= k; i++)38 {39 int s = coo[i];40 if (ans[k-i+1] == s) continue; //如果已经在正确的位置上41 for (int j = 1; j <= k; j++)42 {43 if (ans[j] == s)44 {45 if (j != 1) //如果未在顶端,先将它颠倒至顶端46 {47 convert(j); 48 path[num++] = k - j + 1; 49 }50 break;51 }52 }53 convert(k - i + 1); //颠倒至正确位置54 path[num++] = i ;55 }56 path[num++] = 0;57 }58 59 int main()60 {61 //freopen("D:\\txt.txt", "r", stdin);62 while (getline(cin,line ))63 {64 k = 0;65 int x;66 stringstream ss(line);67 while (ss >> x) ans[++k] = x;68 for (int i = 1; i < k; i++)69 cout << ans[i] << " ";70 cout << ans[k] << endl;71 solve();72 for (int i = 0; i < num - 1; i++)73 cout << path[i] << " ";74 cout << path[num - 1] << endl;75 }76 return 0;77 }

 

转载于:https://www.cnblogs.com/zyb993963526/p/6352108.html

你可能感兴趣的文章
redis——搭建
查看>>
“机器学习”原理(由浅入深)
查看>>
vc下tolua++的使用
查看>>
memcached 一致性hash原理
查看>>
github简单使用教程
查看>>
学习typescript(一)
查看>>
配置淘宝镜像
查看>>
java基础介绍(转)
查看>>
无线网卡01
查看>>
( 转)性能测试--地铁模型分析
查看>>
c#获取图片的高和宽
查看>>
Apache(httpd)实现反向代理
查看>>
表单美化-原生javascript和jQuery多选按钮(兼容IE6)
查看>>
parse与stringify
查看>>
tensorflow-TensorBoard
查看>>
C++ 中 delete 和 delete[] 的区别
查看>>
简单范例php调用C# WebService
查看>>
[转] KVM虚拟化技术生态环境介绍
查看>>
【9】分布式锁
查看>>
Linux内核分析:Linux内核源码目录结构
查看>>