样例输入:
2 7 200000 500000 4 6 120 2680 3400 200 -1 -1
样例输出:
100000 1700有n个城市,m个投票箱。每个城市的人口分别是xi。求票数最大的投票箱内票数最少时的数目。
思路:尽量均分。
【二分版】
#include <iostream>
#include <iomanip>
#include <fstream>
#include <sstream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <functional>
#include <numeric>
#include <string>
#include <set>
#include <map>
#include <stack>
#include <vector>
#include <queue>
#include <deque>
#include <list>
using namespace std;
typedef long long ll;
int a[500000+100];
bool cmp(int a, int b)
{
return a>b;
}
int main()
{
int n,b;
while(scanf("%d%d",&n,&b),n!=-1)
{
int l=0,r=0;
for(int i=0 ; i<n ; ++i)
{
scanf("%d",&a[i]);
}
sort(a,a+n,cmp);
r=a[0];
while(l<r)
{
int mid=(l+r)/2;
int k=0;
for(int i=0 ; i<n ; ++i)
{
if(a[i]<=mid)
{
k++;
continue;
}
int t=a[i]/mid;
if(a[i]%mid)
t++;
k+=t;
}
if(k<=b)
{
r=mid;
}
else
{
l=mid+1;
}
}
printf("%d\n",l);
}
}
【优先队列版】
#include<iostream>
#include<algorithm>
#include<string>
#include<map>
#include<vector>
#include<queue>
#include<cmath>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#define ll long long
#define mod 10000
using namespace std;
struct node{
int a,b,c; //当前城市值,盒子数
}x[500005];
struct cmp{
bool operator()(const node &t1,const node &t2){
return t1.a<t2.a; //从大到小,与数组规则相反
}
};
int main(){
priority_queue<node,vector<node>,cmp> q;
int n,m;
while(cin>>n>>m){
if(n==-1&&m==-1)
break;
while(!q.empty())
q.pop();
for(int i=0;i<n;++i){
cin>>x[i].a;
x[i].b=1;
x[i].c=x[i].a;
q.push(x[i]);
}
int maxx=0;
for(int i=0;i<m-n;++i){
node fr=q.top();
q.pop();
fr.b++;
fr.a=fr.c/fr.b;
if(fr.c%fr.b!=0)
fr.a++;
q.push(fr);
}
node fr=q.top();
cout<<fr.a<<endl;
}
return 0;
}