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