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