UPC NO.30场 问题 A: 选举
时间限制: 1 Sec 内存限制: 128 MB
题目描述
C国的总统选举委员会最近遇到了一些麻烦。
他们在统计各省对H先生的支持率(百分比)时,把支持率四舍五入到了整数。等他们公布结果后,该国媒体发现这些省份的支持率之和不等于100(百分比)!在媒体黑幕声的质疑下,他们不得不找你寻求帮助。
你将得到各省四舍五入后的支持率,请计算这些省份的支持率在四舍五入前的和是否可能等于100?支持率是以百分比的形式统计的。
请注意,各省的支持率可以是一个包含任意多位的有限小数。一个小数在四舍五入到整数时,若小数点后第一位小于5则舍,大于等于5则入。
例如:
26、17、58是一种可能的支持率,因为它们可能是25.8、16.5、57.7四舍五入后得到的,而25.8+16.5+57.7=100。
49、49是一种不可能的支持率,因为当9的个数有限时,无论有多少个9,均有49.499…99+49.499…99<100。
输入
输入包含多组数据,第一行是一个整数T,表示数据组数。
接下来是T组数据,每组数据的第一行是一个整数N,表示参与选举的省份个数。第二行是N个整数,表示各省四舍五入后的支持率。
输出
对于每组数据,若是一种可能的支持率,输出Yes,否则输出No。
样例输入
2
2
49 49
3
26 17 58
样例输出
No
Yes
提示
对于30%的数据,1<=n<=3;
对于50%的数据,1<=n<=5;
对于80%的数据,1<=四舍五入后各省的支持率<=99;
对于100%的数据,1<=n<=10000,输入数据中的所有整数均在有符号16位整数范围内。
题解:可以求出使用给出的N个支持率,最终可能的支持率的取值范围,检查该范围是否包含100。
一般情况下,一个数X在取舍前可能取[X-0,5,X+0.5)之间的任意数值。需要注意0和100等边界问题,因为支持率(百分比)一定是一个[0,100]之间的数。求出的取值范围最好使用整数并加以开闭区间判断,避免实数精度误差。
#include <bits/stdc++.h>
using namespace std;
int T,n;
int main()
{
scanf("%d",&T);
while(T--)
{
int big=0,sma=0,sum=0;
bool flag=false;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int a;
scanf("%d",&a);
if(a<0||a>100) flag=true;
if(a==0) sma++;
else if(a==100) big++;
else sma++,big++;
sum+=a;
}
if(flag) {puts("No"); continue;}
if(sum==100) puts("Yes");
if(sum>100) {
if((sum-100)*2<=big) puts("Yes");
else puts("No");
}
if(sum<100) {
if((100-sum)*2<sma) puts("Yes");
else puts("No");
}
}
return 0;
}