Codeforces Round #402 (Div. 2) A. Pupils Redistribution(交换次数)
2017-02-28 20:42
405 查看
题目链接:http://codeforces.com/contest/779/problem/A?mobile=false
【中文题意】给你两个长度相等的序列,问你最少交换多少次,使两个序列变成相同的序列,如果不可以的话输出-1。
【思路分析】这个题我感觉我做的特别复杂。直接开了5个map来储存数据和信息。m,m1,m2,f1,f2。m来储存这两个序列中所有的数的次数,m1来记录第一个序列中出现的数的次数,m2来记录第二个序列中出现的数的次数,f1来记录第一个序列中的某一个元素是不是已经被扫过,f2记录第二个序列中的某一个元素是不是被扫过。假如某一个元素在两个序列中出现的总次数是奇数,那么答案肯定是-1,然后记录两个序列中分别需要挪出多少个元素才可以达到最终的状态,如果需要挪出的元素的个数不一样的话答案也是-1 。是不是很复杂呢…….感觉很复杂。
【AC代码】
【中文题意】给你两个长度相等的序列,问你最少交换多少次,使两个序列变成相同的序列,如果不可以的话输出-1。
【思路分析】这个题我感觉我做的特别复杂。直接开了5个map来储存数据和信息。m,m1,m2,f1,f2。m来储存这两个序列中所有的数的次数,m1来记录第一个序列中出现的数的次数,m2来记录第二个序列中出现的数的次数,f1来记录第一个序列中的某一个元素是不是已经被扫过,f2记录第二个序列中的某一个元素是不是被扫过。假如某一个元素在两个序列中出现的总次数是奇数,那么答案肯定是-1,然后记录两个序列中分别需要挪出多少个元素才可以达到最终的状态,如果需要挪出的元素的个数不一样的话答案也是-1 。是不是很复杂呢…….感觉很复杂。
【AC代码】
#include<cstdio> #include<cstring> #include<string> #include<cmath> #include<map> #include<queue> #include<stack> using namespace std; int a[106],b[106]; int main() { int n; while(~scanf("%d",&n)) { map<int ,int>m,m1,m2,f1,f2; for(int i=0;i<n;i++) { scanf("%d",&a[i]); m[a[i]]++; m1[a[i]]++; } for(int i=0;i<n;i++) { scanf("%d",&b[i]); m[b[i]]++; m2[b[i]]++; } int flag=1,in1=0,in2=0,out1=0,out2=0; for(int i=0;i<n;i++) { if(m[a[i]]%2) { flag=0; break; } if(f1[a[i]]==0&&m[a[i]]!=2*m1[a[i]]) { if(m[a[i]]>2*m1[a[i]]) { in1+=m[a[i]]/2-m1[a[i]]; } else { out1+=m1[a[i]]-m[a[i]]/2; } } f1[a[i]]++; } for(int i=0;i<n;i++) { if(m[b[i]]%2) { flag=0; break; } if(f2[b[i]]==0&&m[b[i]]!=2*m2[b[i]]) { if(m[b[i]]>2*m2[b[i]]) { in2+=m[b[i]]/2-m2[b[i]]; } else { out2+=m2[b[i]]-m[b[i]]/2; } } f2[b[i]]++; } //printf("%d %d %d %d\n",in1,out1,in2,out2); if(flag&&out2==out1) { printf("%d\n",out1); } else { printf("-1\n"); } } return 0; }
相关文章推荐
- Codeforces Round #402 (Div. 2) D(简单)(二分)
- 【Codeforces Round 331 (Div 2)B】【水题 贪心】Wilbur and Array 修改对p位置后的所有位置生效 最少修改次数使得数列变成b
- Codeforces Round #402 (Div. 2) D. String Game(二分)
- 【Codeforces Round 326 (Div 2)C】【贪心】Duff and Weight Lifting 每次取数二的幂数最小取数次数
- 【Codeforces Round 324 (Div 2)E】【贪心 构造】Anton and Ira 全排列交换 最小距离成本
- 【Codeforces Round 323 (Div 2)B】【贪心】Robot's Task 最少转弯次数拿走所有物品
- 【Codeforces Round 354 (Div 2)A】【水题 贪心】Nicholas and Permutation 恰好交换一次的pos[n]-pos[1]
- 【Codeforces Round 367 (Div 2) E】【十字链表 边框维护】Working routine nm矩形交换q次子矩形的最终矩形
- 【Codeforces Round 363 (Div 2) D】【环套树 贪心 脑洞】Fix a Tree 每点一出度,最小修改次数使得变为反向有根树
- Codeforces Round #402 (Div. 1) A. String Game
- Codeforces Round #402 (Div. 1) D. Parquet Re-laying(脑洞)
- Codeforces Round #402 (Div. 2)
- Codeforces Round #402 (Div. 2) D. String Game
- 【Codeforces Round 336 (Div 2) D】【区间DP 讨论 好题】Zuma 区间取回文串最小操作次数使得取光全串
- 【Codeforces Round 365 (Div 2)D】【离线询问 树状数组 前驱思想】Mishka and Interesting sum 区间内出现次数偶数的数的异或和
- Codeforces Round #402 (Div. 2)C. Dishonest Sellers【贪心】这个贪心好水啊....
- Codeforces Round #400 (Div. 1 + Div. 2, combined)D - The Door Problem(2-sat)
- Codeforces Round #104 (Div. 2) //缺E
- Codeforces Round 134 div 2 C题
- Codeforces Round #134 (Div. 2) A_B_C_D题