UVA - 10570 Meeting with Aliens 暴力
2015-05-01 15:28
351 查看
题目大意:有n个外星人要开园桌会议,外星人的编号由1到n,要求编号为i的外星人的相邻位置必须坐着编号为i-1和编号为i+1的外星人。
现在给出n个外星人坐在圆桌上的顺序,要求你经过最少次交换(交换是两个外星人交换所坐位置),使得所有外星人坐法都符合上诉规则。
解题思路:枚举每个外星人坐的位置,假设该位置坐的必须是编号为1的外星人,然后编号从左递增或者递减,最后检查该安排需要交换几次外星人
如果该外星人坐的位置是错的话,就直接把适合坐该座位的外星人何其交换过来,这样的交换次数是最少的
现在给出n个外星人坐在圆桌上的顺序,要求你经过最少次交换(交换是两个外星人交换所坐位置),使得所有外星人坐法都符合上诉规则。
解题思路:枚举每个外星人坐的位置,假设该位置坐的必须是编号为1的外星人,然后编号从左递增或者递减,最后检查该安排需要交换几次外星人
如果该外星人坐的位置是错的话,就直接把适合坐该座位的外星人何其交换过来,这样的交换次数是最少的
[code]#include<cstdio> #include<cstring> #define maxn 510 int pos[maxn], start[maxn], end[maxn], n; int exchange() { int cnt = 0; for(int i = 1; i <= n; i++) { if(end[i] != i) { pos[end[i]] = pos[i]; end[pos[i]] = end[i]; cnt++; } } return cnt; } void solve() { int MIN = 0x3f3f3f3f; for(int i = 1; i <= n; i++) { for(int j = 1, k = i; j <= n; j++, k++) { if(k > n) k = 1; end[j] = start[k]; pos[end[j]] = j; } int t = exchange(); MIN = (t > MIN? MIN:t); } for(int i = 1; i <= n; i++) { for(int j = 1, k = i; j <= n; j++, k--) { if(k <= 0) k = n; end[j] = start[k]; pos[end[j]] = j; } int t = exchange(); MIN = (t > MIN? MIN:t); } printf("%d\n", MIN); } int main() { while(scanf("%d", &n) == 1 && n) { for(int i = 1; i <= n; i++) scanf("%d", &start[i]); solve(); } return 0; }
相关文章推荐
- UVa 10570 Meeting with Aliens (暴力)
- UVA_10570_Meeting with Aliens
- UVa - 10570 - Meeting with Aliens
- UVA 10570 Meeting with Aliens
- uva 10570 meeting with aliens
- UVa - 10570 - Meeting with Aliens
- uva10570---外星人聚会(meeting with aliens)
- UVA 10570 Meeting with Aliens
- 【习题 8-13 UVA - 10570】Meeting with Aliens
- UVA 10570 Meeting with Aliens 外星人聚会
- UVA - 10570 Meeting with Aliens
- UVA 10570 Meeting with Aliens
- UVa 10570 Meeting with Aliens
- UVA 10570 meeting with aliens
- uva 10570 Meeting with Aliens
- UVa - 10570 - Meeting with Aliens
- uva 10570 - Meeting with Aliens
- UVa - 10570 - Meeting with Aliens
- UVA 10570 Meeting with Aliens 【枚举+结论题】
- UVA 10570 Meeting with Aliens