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


posted @ 2017-10-06 19:23  AWCXV  阅读(178)  评论(0编辑  收藏  举报