【UESTC 1523 我想上厕所】
来源:互联网 发布:淘宝手机壳店 编辑:程序博客网 时间:2024/04/28 06:18
我想上厕所
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
Submit Status
正如地球上有三种性别的人(男、女、秀吉),需要三种厕所。EX星也是,这里有n个性别,每个性别对应一个厕所,性别i对应厕所i。
现在所有的n种厕所按1、2、3……n的顺序围成一个圈(每种一个),每个厕所都有一个人(保证n个性别的人都正好有一个),每个厕所只能一个人用,有些人上对了厕所,有些人上错了厕所。
你的任务是让每个人都上对厕所,你只可以交换相邻厕所(i号厕所和i+1号、1号和n号)位置的人,问题是你最少需要进行多少次这样的操作。
保证最多只有3个人上错厕所。
Input
第一行一个整数n(1≤n≤233) n(1≤n≤233),表示厕所个数。接下来一行有n个整数表示第i号厕所的人的性别。
Output
每组数据输出一行表示最少操作数。
Sample input and output
Sample Input
Sample Output
1
1 0
4
4 2 3 1 1
5
2 4 3 1 5 4
Source
第八届ACM趣味程序设计竞赛第二场(正式赛)
最多三个不一样的:
1)都一样 : 0
2)两个不一样 : 距离 × 2 - 1
3)三个不一样 : 找到中间那个错的位置,找到最中间的数对应的正确位置,因为三个位置错的,必定对应其中的一个,而交换后,剩余的两个在做交换即可~每次换后都需要把原来正确位置的数移动回去~所有每次的代价为 距离 × 2 - 1
AC代码:
#include<cstdio>#include<algorithm>using namespace std;int a[4],s[4];int main(){ int N,b,nl = 0; scanf("%d",&N); for(int i = 1; i <= N; i++){ scanf("%d",&b); if(b != i) a[++nl] = i; } if(nl == 0) printf("0\n"); else if(nl == 3){ int sum12 = min(a[2] - a[1],N - a[2] + a[1]); int sum13 = min(a[3] - a[1],N - a[3] + a[1]); int sum23 = min(a[3] - a[2],N - a[3] + a[2]); s[1] = sum12 * 2 - 1 + sum13 * 2 - 1; s[2] = sum12 * 2 - 1 + sum23 * 2 - 1; s[3] = sum13 * 2 - 1 + sum23 * 2 - 1; sort(s + 1,s + 1 + 3); printf("%d\n",s[1]); } else{ int ans = min(a[2] - a[1],N - a[2] + a[1]); printf("%d\n",ans * 2 - 1); } return 0;}
0 0
- 【UESTC 1523 我想上厕所】
- 中國移動老總上厕所
- UESTC
- UESTC
- UESTC
- UESTC
- UESTC
- UESTC
- UESTC
- UESTC
- UESTC
- UESTC
- UESTC
- UESTC
- UESTC
- UESTC
- UESTC
- UESTC
- 生成全排列(经典题 && 洛谷 P1706 )
- 1021. 个位数统计 (15)-PAT乙级
- 修改包名最便捷做法
- XML:inerXML和outerXML
- 【数据压缩】bmp2yuv
- 【UESTC 1523 我想上厕所】
- selenium对浏览器操作、鼠标操作等总结
- 安装遇错误无法将grub-efi-amd64-signed软件包安装
- javaScript之跨站脚本攻击
- Arduino入门第一步
- Java反射机制
- JAVA与C++的差异(2)
- Dubbo基于Zookeeper实现分布式服务:Dubbo+Zookeeper+Spring整合应用
- 蓝桥杯-分糖果