题解 UVA10812 Beat the Spread!

题解 UVA10812 Beat the Spread!

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

题目翻译

题目描述

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

输入格式

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

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

输出格式

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

题目大意

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

题目思路

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

\[\begin{cases}a+b=s\\a-b=t\end{cases} \]

自然地联想到消元法:

两式相加得:

\[2a=s+t\Rightarrow a=\frac{s+t}{2} \]

两式相减得:

\[2b=s-t\Rightarrow b=\frac{s-t}{2} \]

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

另外考虑 \(s\)\(t\) 都是正整数故不存在 \(s+t<0\) 的情况,所以当 \(s-t<0\) 时输出 \(\textit{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\n",(s+t)/2,(s-t)/2);
	}
	return 0;
}
posted @ 2021-04-07 08:42  Sure042  阅读(66)  评论(0编辑  收藏  举报