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;
}

浙公网安备 33010602011771号