题解 UVA10812 Beat the Spread!

题解 UVA10812 Beat the Spread!

这里提供一份良(mei)心(yong)的:

题目翻译

题目描述

超级碗冠军比赛-文斯·隆巴迪杯赛快到了。为了打发等待半场广告和服装故障(?)的时间,当地黑客组织了一个游戏投注池。会员们把赌注押在最后两个得分的总和上,或押在两个得分之差的绝对值上。根据每场赌注的中将好吗,你能推断出最后的得分吗?

输入格式

第一行一个 (n) ,表示测试数据的数量。

接下来 (n) 行,每行代表一组测试数据。每组测试数据都给出非负整数 (s)(t) ,分别表示两个得分之和与差的绝对值。

输出格式

对于每组测试数据,输出一行两个最终得分,大的在前。若不存在这样的得分,输出 "inpossible" 回想一下,足球得分恒非负。

题目大意

对于每组数据,输入 (a+b)(|a-b|) ,求出 (a)(b) 的值。

题目思路

题目要求先输出较大数,那我们假设对于两个得分有 (a ge b) ,则有一元二次方程组:

[egin{cases}a+b=s\a-b=tend{cases} ]

自然地联想到消元法:

两式相加得:

[2a=s+tRightarrow a=frac{s+t}{2} ]

两式相减得:

[2b=s-tRightarrow b=frac{s-t}{2} ]

题目要求 (a)(b) 都为整数,故当 (s+t) 为奇数时一定不符合题意,输出 ( extit{impossible})

另外考虑 (s)(t) 都是正整数故不存在 (s+t<0) 的情况,所以当 (s-t<0) 时输出 ( extit{impossible})

Code

#include<bits/stdc++.h>
using namespace std;
long long s,t,n;
int main()
{
	cin>>n;
	while(n--)
	{
		cin>>s>>t;
		if(s+t<0||s-t<0||(s+t)%2) puts("impossible");
		else printf("%d %d
",(s+t)/2,(s-t)/2);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/Sure042/p/tijie-uva10812.html