http://acm.pku.edu.cn/JudgeOnline/problem?id=1064
Код:
program PKU1064; {$S-,Q-,R-,I-} const maxn = 10001; type integer = longint; var n, m, l, r: integer; a: array[1..maxn] of integer; procedure prepare; var i: integer; j: double; begin read(n, m); r := 1; for i := 1 to n do begin read(j); a[i] := round(j * 100); if a[i] > r then r := a[i]; end; end; function calc(c: integer): integer; var k, i: integer; begin if c = 0 then calc := m + 1 else begin k := 0; for i := 1 to n do begin k := k + a[i] div c; if k >= m then break; end; calc := k; end; end; procedure main; var mid: integer; begin l := 0; while l < r do begin mid := (l + r + 1) shr 1; if calc(mid) >= m then l := mid else r := mid - 1; end; writeln(l / 100:1:2); end; begin prepare; main; end.
Код:
#include "iostream" using namespace std; int n,k; int a[10100]; bool check(int mid) { int sum=0,i; if(mid==0)return 0; for(i=1; i <= n; ++i) { sum+=a[i]/mid; if(sum >= k)return 1; } return 0; } int erfen(int MIN,int MAX) { int mid; while(MIN <= MAX) { mid=(MIN+MAX)/2; if(check(mid)) { MIN=mid+1; } else MAX=mid-1; } return MAX; } int main() { int max,i; double num,ans; while(scanf("%d%d",&n,&k)!=EOF) { max=0; for(i=1; i <= n; ++i) { scanf("%lf",&num); a[i]=(int)(100*num+0.3); if(max<a[i])max=a[i]; } ans=double(erfen(1,max))/100; printf("%.2lf\n",ans); } return 0; }