选举(模拟)题解

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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米莱虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值