https://www.luogu.org/problemnew/show/P2183
题目描述
佳佳邀请了M个同学到家里玩。为了招待客人,她需要将巧克力分给她的好朋友们。她有N(1<=N<=5000)块巧克力,但是大小各不一样,第i块巧克力大小为为1*Xi(1<=i<=N,1<=Xi<=10000)
为了公平,她需要让每人所分得的巧克力大小一样,而且为了礼貌,巧克力是一整块地分给客人。所以她需要将巧克力分成大小为S的M块,而且使得S最大。但她很忙还要照顾她的客人,所以就将任务交给你了,你需要求出S。
输入输出格式
输入格式:
第一行,N,M
下接N行为N块巧克力的大小。
输出格式:
仅有一行,为巧克力大小S。
输入输出样例
输入样例#1:
复制
Input.txt 9 5 1 2 3 4 5 6 7 8 9
输出样例#1:
复制
Output.txt 5
1 #include <algorithm> 2 #include <cstdio> 3 4 inline void read(int &x) 5 { 6 x=0; register char ch=getchar();; 7 for(; ch>'9'||ch<'0'; ) ch=getchar(); 8 for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0'; 9 } 10 11 int n,m,a[5005]; 12 13 int L,R,Mid,ans; 14 inline bool check(int x) 15 { 16 int cnt=0; 17 for(int i=n; i; --i) 18 { 19 if(cnt>=m) return 1; 20 cnt+=a[i]/x; 21 } 22 return false; 23 } 24 25 int Presist() 26 { 27 read(n),read(m); 28 for(int i=1; i<=n; ++i) read(a[i]); 29 std:: sort(a+1,a+n+1); 30 for(R=a[n]; L<=R; ) 31 { 32 Mid=L+R>>1; 33 if(check(Mid)) 34 { 35 ans=Mid; 36 L=Mid+1; 37 } 38 else R=Mid-1; 39 } 40 printf("%d\n",ans); 41 return 0; 42 } 43 44 int Aptal=Presist(); 45 int main(int argc,char**argv){;}