codeforces 484B - LubaAndTicket - 贪心
2017-08-22 10:54:00
writer:pprp
题意如下:
给你6个数组,你的操作可以是更改某一位的数字成为0-9之间任意一个数,要求前三个数字的和与后三个数字的和相等。
问你最少用几步就可以完成?
分析:这个题太过武断的理解题目了,更改了两次方向才理解正确题目的意思;
一开始理解成只能增加某一位数,
后来比赛以后看了数据,然后理解成能增加或者减少
但是两个理解都不对
应该是每次都可以增加或者减少,大的数组应该减小,小的数组应该增大
贪心的去做
Wa了7次,WA到怀疑人生,最后总算是根据数据漏洞完成写出来AC代码
/* theme:Luba and The Ticket writer:pprp description:审题有问题,可以随意改动一个数,使之变为0-9 自己一开始理解成只能增或者只能减,算法设计失误,重新设计,考虑到小的数组增加和大的数组减小 综合两种情况进行讨论 date:2017/8/22 */ #include <bits/stdc++.h> using namespace std; int a[4], b[4]; int main() { int ans = 0; for(int i = 1 ; i <= 3 ; i++) scanf("%1d",&a[i]); for(int i = 1; i <= 3; i++) scanf("%1d",&b[i]); int sum1 = 0, sum2 = 0; sort(a+1,a+4); sort(b+1,b+4); for(int i = 0 ; i < 3 ; i++) { sum1 += a[i+1]; sum2 += b[i+1]; } //如果两个数组值恰好相等,直接输出0 if(sum1 == sum2) { cout << 0 << endl; return 0; } ans++; //如果数组a 的和大于数组b的和 if(sum1 > sum2) { int i = 3; int j = 1; int cha = abs(sum1 - sum2); //sum的差值如果大于两种情况并且指针j没有越界 while(cha > a[i] && cha > 9 - b[j] && j <= 3) { ans++; //如果大的数组减小幅度大于小的数组上升幅度,选择大的数组 if(a[i] > 9 - b[j]) { sum1 -= a[i]; cha = cha - a[i]; i--; } else { sum2 += 9 - b[j]; cha = cha - 9 + b[j]; j++; } } } else if(sum1 < sum2) { int i = 3; int j = 1; int cha = abs(sum1 - sum2); while(cha > b[i] && cha > 9 - a[j] && j <= 3) { ans++; if(b[i] > 9 - a[j]) { sum1 -= b[i]; cha -= b[i]; i--; } else { sum2 += (9 - a[j]); cha -= (9 - a[j]); j++; } } } cout << ans << endl; return 0; }
代码改变世界