【t049】&&【u001】足球
Time Limit: 1 second
Memory Limit: 128 MB
【问题描述】
我们当中有很多热爱中国足球的同学,我们都知道中超(中国足球超级联赛)的规则:一场比赛中,若获胜(即你的得分严格大于对手得分)则获得3的积分,若打平(即你的得分等于对手得分)则获得1分,若失败(即
你的得分严格小于对手得分)获得0积分。
这个问题很简单,假设N轮比赛中你一共攻入S个球,丢掉T个球,那么你可能获得的最大得分和最小得分是多少?
【输入格式】
多组数据,每组数据一行:一行三个整数S、T、N(S、T >= 0,N >= 1)。
【输出格式】
对于每组数据输出一行,两个整数表示最大得分和最小得分。
Sample Input
1 1 1 1 1 2
Sample Output
1 1 3 2
【题解】
神经病一样的题。
没有严密的思维根本写不出来好吗。
最好的情况要从最好到次好判断
最坏的情况则要从最坏到次坏这样。。
然后总体的思路就是如果能全赢则是最好的。否则就尝试在第一场就把所有球都丢掉。剩余的看一下能不
能用进的球填满(每场只填1个球)。如果填不满就只好平局啦。
然后最坏情况是全都输(如果可以)。或者是第一场把所有的进球都进了。然后剩余n-1场全输。。。
哎,没有这么简单。还要判断的一些小细节很多。总之很恶心。。看注释吧。
【代码】
#include <cstdio> __int64 s, t, n; int main() { while (scanf("%I64d%I64d%I64d", &s, &t, &n) != -1) { __int64 perfect, bad; if (n == 1) //如果只有一场比赛。直接进行特判就好。 { if (s > t) printf("3 3\n"); else if (s == t) printf("1 1\n"); else if (s < t) printf("0 0\n"); continue; } if ((s + t) == 0) //如果一个球都没进,也一个球都没丢。则全是0:0 { printf("%I64d %I64d\n", n, n); continue; } if (s == 0) //如果一个球都没进 { //最好就是在第一场把t分全部输掉。其余场都是0:0 ,上面s+t==0已结排除一个球都没丢的情况。 perfect = n-1; //最坏的话要分情况。 if (t >= n) //如果输的球足够每一场都分配一个则得0分 bad = 0; else //否则少于的部分只能是0:0了。即平局。 bad = n - t; } else if (t == 0)//如果一个球都没丢 { //最好的情况也要分类 if (s >= n) //如果进的球数足够每一场都分一个 perfect = 3 * n;//每一场都赢 else //不够分到每一场 perfect = (n - s)+3*s;//有些场只能平局了。 //最坏的情况就是全都在第一场进的。其余场都是平局 bad = 3 + (n - 1); } else if (s <= t) //如果进球数小于丢球数 { //最好的情况是,第一场把t个球丢掉。然后s足够给剩余n-1场每场分配一个球,即胜n-1场) if (s >= n - 1) perfect = 3 * (n - 1); else //次好则是 s不够分n-1场。则n-1场中有一些平局。 perfect = 3 * s + (n - 1) - s; //接下来考虑最坏的情况。 if (s == 1 && n >= t) //如果只进了一个球且输球数没有超过n bad = 1 + n - t;//把这t个球分配到t场中。这t场除了一场1:1平之外其他场都输,然后另外n-t场为0:0平 else//注:这里不先考虑t-s>=n是因为如果t小于n,后者是不可能成立的。然后该情况比让对方赢一场的其余都输 //可能会更差。 //下面就是按照bad递增来枚举的。 if (t - s >= n)//如果总输球数大于等于n了。则可以n场每场都至少输1球。 bad = 0;//即全都可以输 else if (t - s == n - 1)//如果只有n-1场能输,剩下一场只好平了。 bad = 1; else if (t - s == n - 2)//如果只有n-2场能输,剩余2场只好平了。 bad = 2; else if (t >= n - 1)//如果在第一场把s个球踢进。赢一场。其余n-1场全部输掉。 bad = 3; //最坏情况为3 else //如果剩余t个输球不够填满n-1场。则剩余的平局 bad = 3 + (n - 1) - t; } else //如果进球数大于丢球数 { if (s - t >= n) //如果每一场都能至少赢一球 perfect = 3 * n;//这里的perfect也是按照perfect递减来枚举的。 else if (s - t == n - 1) //如果能n-1场都至少赢一球 ,另外一场平局 perfect = (s - t) * 3 + 1; else if (s >= n - 1) //如果能第一场输t分,然后其余n-1场每场都至少赢1球。 perfect = 3 * (n - 1); else //如果不够的话n-1场里会有几场是平的。 perfect = 3 * s + (n - 1) - s; //然后是最坏情况。 //即第一场把s球全部踢进.然后看一下丢球数够不够填满n-1场。 if (t >= n - 1) bad = 3; else //不够的话就是平局了。 bad = 3 + (n - 1) - t; } printf("%I64d %I64d\n", perfect, bad); } return 0; }