Uva 120 Stacks of Flapjacks
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=56
题目描述:给出a[1...n]和一种flip,每次flip允许对a[1...x]的位置进行反转(a[x]=a[1]...),问得到升序的反转方法。
首先是输入:gets读入一行,得到a[]
其次是离散化:并没有给出是1...n排列的条件,a[]可能不连续,需要离散化
然后是如何反转:因为n<=30,复杂度要求不高,可以考虑从后往前排,即先把最大的放在最后,然后依次把第二大...最小的放到对应的位置即可
// 22::19 # include <stdio.h> # include <string.h> # include <stdlib.h> int n; char s[3500]; int a[35]; int r[35]; int main() { while (gets(s) != NULL) { puts(s); n = 0; char *p = s; while (sscanf(p, "%d", &a[n++]) != EOF) { for ( ; *p && (*p) != ' '; ++p) ; if (!*p) break; else ++p; } for (int i = 0; i < n; ++i) r[i] = 0; for (int i = 0; i < n; ++i) { for (int j = i+1; j < n; ++j) { if (a[i] < a[j]) ++r[j]; else ++r[i]; } } int target = n-1; int i; while (target > 0) { for (i = 0; i < n; ++i) {if (r[i] == target) break; } if (target != i) { if (i != 0) { printf("%d ", n-i); int mid = (i+1)/2; for (int k = 0; k < mid; ++k) { int tmp = r[k]; r[k] = r[i-k]; r[i-k] = tmp; } } printf("%d ", n-target); int mid = (target+1)/2; for (int k = 0; k < mid; ++k) { int tmp = r[k]; r[k] = r[target-k]; r[target-k] = tmp; } } --target; } printf("0\n"); } return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· 本地部署 DeepSeek:小白也能轻松搞定!
· 基于DeepSeek R1 满血版大模型的个人知识库,回答都源自对你专属文件的深度学习。
· 在缓慢中沉淀,在挑战中重生!2024个人总结!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!