hdu_4190 DistributingBallot Boxes

DistributingBallot Boxes

Time Limit: 20000/10000 MS (Java/Others) Memory Limit:65536/32768 K (Java/Others)
Total Submission(s): 310 Accepted Submission(s): 154

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4190

Problem Description

Today, besides SWERC'11,another important event is taking place in Spain which rivals it in importance:General Elections. Every single resident of the country aged 18 or over isasked to vote in order to choose representatives for the Congress of Deputiesand the Senate. You do not need to worry that all judges will suddenly run awayfrom their supervising duties, as voting is not compulsory.
The administration has a number of ballot boxes, those used in past elections.Unfortunately, the person in charge of the distribution of boxes among citieswas dismissed a few months ago due to nancial restraints. As a consequence, theassignment of boxes to cities and the lists of people that must vote in each ofthem is arguably not the best. Your task is to show how effi
ciently this task could have been done.
The only rule in the assignment of ballot boxes to cities is that every citymust be assigned at least one box. Each person must vote in the box to whichhe/she has been previously assigned. Your goal is to obtain a distributionwhich minimizes the maximum number of people assigned to vote in one box.
In the first case of the sample input, two boxes go to the fi rst city and therest to the second, and exactly 100,000 people are assigned to vote in each ofthe (huge!) boxes in the most effi
cient distribution. In the second case, 1,2,2 and 1 ballot boxes are assignedto the cities and 1,700 people from the third city will be called to vote ineach of the two boxes of their village, making these boxes the most crowded ofall in the optimal assignment.

 

Input

The fi rst line of each testcase contains the integers N (1<=N<=500,000), the number of cities, andB(N<=B<=2,000,000), the number of ballot boxes. Each of the following Nlines contains an integer ai,(1<=ai<=5,000,000), indicatingthe population of the ith city.
A single blank line will be included after each case. The last line of theinput will contain -1 -1 and should not be processed.

 

Output

For each case, your programshould output a single integer, the maximum number of people assigned to onebox in the most e
fficient assignment.

 

Sample Input

2 7

200000

500000

 

4 6

120

2680

3400

200

 

-1 -1

 

Sample Output

100000

1700

 

Source

SWERC 2011

 

Recommend

lcy

 

题目大意:

         n个城市,m个投票箱,接下来是n行表示每个城市的人口,问每个投票箱的容量最大为多大才刚好满足每个人的投票

解题思路:

         这个题目可以用二分法来解决,如果投票箱的数量等于城市的数量,那么这些城市中最多人的城市就是每个投票箱的容量,如果投票箱的数量大于城市的数量,那么就去最大值进行二分查找,直到当l>r时接收。返回时不是返回中间值,而是返回最大值r.

 

 

代码:

 

#include <iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#define MAXN 500003
using namespace std;

int arr[MAXN];
int n,m;

//判断mid这个数是否符合要求,如果返回值为false表示投票箱不够
bool getMaxValue(int mid)
{
    int i;
    int sum=0;
    for(i=0;i<n;i++)
    {
        if(arr[i]<=mid)
            sum+=1;
        else if(arr[i]>mid)
        {
            sum+=ceil(arr[i]*1.0/mid);//上取整
        }
    }
    if(sum<=m)
        return true;
    else//投票箱有剩余
        return false;

}



int binarySearch(int l,int r)
{
	int mid;
	while(l<r)
	{
		mid=(l+r)/2;
		if(getMaxValue(mid))
			r=mid;
		else
			l=mid+1;
	}
	return r;
}



int main()
{
    int max;
    while(true)
    {
        scanf("%d%d",&n,&m);
        if(n==-1 && m==-1)
            break;
        memset(arr,-1,sizeof(arr));
        max=-1;
        for(int i=0;i<n;i++)
        {
            scanf("%d",&arr[i]);
            if(arr[i]>max)
                max=arr[i];
        }
        if(n==m)
            printf("%d\n",max);
        else if(n<m)
        {
            int val=binarySearch(1,max);
            printf("%d\n",val);
        }
    }

    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

疯的世界

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

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

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

打赏作者

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

抵扣说明:

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

余额充值