HUT 排序训练赛 B - Vote

Time Limit: 1000MS   Memory Limit: 65535KB   64bit IO Format: %lld & %llu

[]   [Go Back]   [Status]  

Description

美国大选是按各州的投票结果来确定最终的结果的,如果得到超过一半的州的支持就可以当选,而每个州的投票结果又是由该州选民投票产生的,如果某个州超过一 半的选民支持希拉里,则她将赢得该州的支持。现在给出每个州的选民人数,请问希拉里至少需要赢得多少选民的支持才能当选?

Input

多组输入数据
每组数据的第一行包括一个整数N(1<=N<=101),表示美国的州数,N=0表示输入结束
接下来一行包括N个正整数,分别表示每个州的选民数,每个州的选民数不超过100

Output

对于每组数据输出一行,表示希拉里至少需要赢得支持的选民数

Sample Input

3
5 7 5
0

Sample Output

6

Source

电子科技大学第六届ACM程序设计大赛 决赛

 

 

【题目来源】

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=41455#problem/B

【题目大意】

投票问题,如果得到超过一半的州的支持就可以当选,而每个州的投票结果又是由该州选民投票产生的,每个州的投票人数超过半数测获得该州的支持。

这道题有几点要注意:要获得最后的胜利,就得获得一半以上的州票,一半以上也就是(n/2+1),不需要分什么奇数偶数,同理,每个州的人数也是这样处理。

排序以后用一个for语句相加就可以了。

源代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
using namespace std;
int cmp(int data[], int begin, int end)
{
    int mid = begin - 1;
    for (int i= begin; i < end; i++)

    {
        if (data[i] < data[end])
            swap(data[++mid], data[i]);
    }
    swap(data[++mid], data[end]);
    return mid;
}
void quickSort(int data[], int begin, int end)
{
    if (begin<end)
    {
        int mid = cmp(data, begin, end);
        quickSort(data, begin, mid - 1);
        quickSort(data, mid + 1, end);
    }
}
int main()
{
     int a[110];
     int n;
     int i,j;
     int sum;
     while((cin>>n)&&n!=0)
     {
         sum=0;
         for(i=0;i<n;i++)
         {
             cin>>a[i];
         }
         quickSort(a,0,n-1);
         for(i=0;i<n/2+1;i++)
         {
             sum+=a[i]/2+1;
         }
         cout<<sum<<endl;
     }


    return 0;
}

 

 

你可能感兴趣的:(排序)