The 2011 Southwestern Europe Regional Contest D, UVa-12390 : Distributing Ballot Boxes
問題概要
N(<5*10^5)の都市がある。また、箱がB(N
考えたこと
- 最大値の最小化といえば二分探索が思い浮かぶ。
- 実際それで行けそう。判定は切り上げの割り算をすればいい。オーバーフローだけに気をつける。
本番で通ったコード
計算量
#include <cstdio> using namespace std; const int MAX_N = 500000; typedef long long int64; int N, B; int as[MAX_N]; void init(){ for(int i=0; i<N; i++){ scanf("%d", as+i); } } bool check(int x){ int64 cnt = 0; for(int i=0; i<N; i++){ cnt += (as[i] + x - 1) / x; } return cnt <= B; } int solve(){ int low = 0, high = 1e7; while(high - low > 1){ int mid = (low + high) / 2; if(check(mid)){ high = mid; } else{ low = mid; } } return high; } int main(){ while(scanf("%d%d", &N, &B), N+1){ init(); printf("%d\n", solve()); } return 0; }