B - Distributing Ballot Boxes HDU - 4190

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 is asked to vote in order to choose representatives for the Congress of Deputies and the Senate. You do not need to worry that all judges will suddenly run away from 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 cities was dismissed a few months ago due to nancial restraints. As a consequence, the assignment of boxes to cities and the lists of people that must vote in each of them is arguably not the best. Your task is to show how efficiently this task could have been done.
The only rule in the assignment of ballot boxes to cities is that every city must be assigned at least one box. Each person must vote in the box to which he/she has been previously assigned. Your goal is to obtain a distribution which 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 the rest to the second, and exactly 100,000 people are assigned to vote in each of the (huge!) boxes in the most efficient distribution. In the second case, 1,2,2 and 1 ballot boxes are assigned to the cities and 1,700 people from the third city will be called to vote in each of the two boxes of their village, making these boxes the most crowded of all in the optimal assignment.

Input

The fi rst line of each test case contains the integers N (1<=N<=500,000), the number of cities, and B(N<=B<=2,000,000), the number of ballot boxes. Each of the following N lines contains an integer a i,(1<=a i<=5,000,000), indicating the population of the i th city.
A single blank line will be included after each case. The last line of the input will contain -1 -1 and should not be processed.

Output

For each case, your program should output a single integer, the maximum number of people assigned to one box in the most efficient assignment.

Sample Input

2 7
200000
500000

4 6
120
2680
3400
200

-1 -1

Sample Output

100000
1700

题目大意:N个城市,M个投票箱,每个城市必须要有一个,然后问每个投票箱投票最少的最大值。

第一行输入是N和M;后面N行是每个城市的人数。

解题思路:用二分法做,因为每个箱子投票数肯定在1和最大人数之间,然后用二分法找到这样的符合题意的最小值即可。

代码如下:

  1. #include<stdio.h>
  2. int a[5055600];
  3. int n,m;
  4. int cher(int x)
  5. {
  6.     int sum=0;
  7.     for(int i=0; i<n; i++)
  8.     {
  9.         sum+=(a[i]%x?a[i]/x+1:a[i]/x);//如果N个箱子放不完,需要多加一个
  10.     }
  11.     if(sum>m) return 0;               //是否超出所给的箱子
  12.     else return 1;
  13. }
  14. int fun(int a,int b)
  15. {
  16.     int mid;
  17.     while(a<b)
  18.     {
  19.         mid=(a+b)/2;
  20.         if(cher(mid)==0)       //判断箱子是否够用
  21.             a=mid+1;           //不够用,箱子里面的票数需要加。
  22.         else
  23.             b=mid;             //减少最大值。
  24.     }
  25.     return b;
  26. }
  27. int main()
  28. {
  29.     while(~scanf("%d%d",&n,&m))
  30.     {   if(n==-1&&m==-1)
  31.            break;
  32.         int i,maxx=-100;
  33.         for(i=0; i<n; i++)
  34.         {
  35.             scanf("%d",&a[i]);
  36.             if(maxx<a[i])
  37.                 maxx=a[i];
  38.         }
  39.         if(n==m)
  40.             printf("%d\n",maxx);
  41.         else
  42.         {
  43.             printf("%d\n",fun(1,maxx));
  44.         }
  45.     }
  46.     return 0;
  47. }
     

猜你喜欢

转载自blog.csdn.net/TANG3223/article/details/81155431