codeforces 732C 377C
数学乱搞题,我的思路就是一共三种情况,6种大小关系讨论一下。
其中多余的天书我怎么来处理?其实不难,就是我们这么想,我们让多余的天数单独出去,比如早上的,我们可以最后一天吃完早饭然后走了,或者晚上的话,我们可以提前一下。
说明,这道题目没有取得ac,代码尚在改进,但是我觉得思路不存在问题,所以我们这题先放着,明天早晨来解决一下。
事实证明,那种分6种情况,是一种愚蠢的做法
思考,无论哪种情况多,我们都可以有方法平衡,所以情况都是一样,我们只要求一个最大值,然后逐个比较就好(比如早上和晚上多,就是早上走,晚上来)
正确的思路
#include <stdio.h> #include <iostream> using namespace std; typedef long long ll; int main() { ll b, s, d; while(scanf("%lld%lld%lld", &b, &s, &d) != EOF) { ll maxx = max(max(b, s),d); ll ans = 0; if(b < maxx) ans += maxx - b - 1; if(s < maxx) ans += maxx - s - 1; if(d < maxx) ans += maxx - d - 1; printf("%lld\n",ans); } return 0; }
错误的代码(仅供参考)
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; typedef long long ll; int main() { ll b,s,d; while(scanf("%lld%lld%lld", &b, &s, &d) != EOF) { if(b >= s && s >= d) { //原则是所有都尽可能接近,由于d最小,我们不妨先是d个完整周期 ll b1 = b - d; ll s1 = s - d; if(b1 == 0) printf("%lld\n", b1); else if(b1 != 0) { b1 = b1 - 1; if(s1 != 0 && s1 != 1) s1 = s1 - 1; printf("%lld\n", b1 - s1 + b1); } } else if(b >= d && d >= s) { //同理,不妨是s个周期 ll b1 = b - s; ll d1 = d - s; if(b1 == 0) printf("%lld\n", b1); else if(b1 != 0 ) { b1 = b1 - 1; if(d1 != 0 && d1 != 1) d1 = d1 - 1; printf("%lld\n",b1 - d1 + b1); } } else if(s >= b && b >= d) { ll s1 = s - d; ll b1 = b - d; if(s1 == 0) printf("%lld\n", s1); else if(s1 != 0 ) { s1 = s1 - 1; b1 = b1 - 1; printf("%lld\n", s1 - b1 + s1); } } else if(s >= d && d >= b) { ll s1 = s - b; ll d1 = d - b; if(s1 == 0) printf("%lld\n", s1); else { s1 = s1 - 1; d1 = d1 - 1; printf("%lld\n", s1 - d1 + s1); } } else if(d >= b && b >= s) { ll d1 = d - s; ll b1 = b - s; if(d1 == 0) printf("%lld\n", d1); else { d1 = d1 - 1; if(b1 != 0 && b1 != 1) b1 = b1 - 1; printf("%lld\n", d1 - b1 + d1); } } else if(d >= s && s >= b) { ll d1 = d - b; ll s1 = s - b; if(d1 == 0) printf("0\n"); else { d1 = d1 - 1; if(s1 != 0 && s1 != 1) s1 = s1 - 1; printf("%lld\n", d1 - s1 + d1); } } } return 0; }