题目链接:http://poj.org/problem?id=3104
(10^5)*(10^9) = 10^14,注意可能超int
当k为1的情况
一个小技巧,整数运算中,a/b的上取整可以用(a+b-1)/b
二分搜素,使用左开右闭区间,没什么多讲的
下面提供两个AC版本的代码,都是可以的
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
//typedef long long ll;
int a[100005];
int n, k;
bool C(int d){
int cnt = 0;
for(int i=0; i<n; i++){
if(a[i] > d){
cnt += (a[i]-d + k-2)/(k-1); //注意除数不能为0
if(cnt > d) return false;
}
}
//if(cnt > d) return false;
//else return true;
return true;
}
int main(){
while(scanf("%d", &n) != EOF){
for(int i=0; i<n; i++)
scanf("%d", &a[i]);
sort(a, a+n);
scanf("%d", &k);
if(k == 1){
printf("%d\n", a[n-1]);
continue;
}
int lb = 0, ub = a[n-1];
while(ub - lb > 1){
int mid = (lb+ub)/2;
if(C(mid)) ub = mid;
else lb = mid;
}
printf("%d\n", ub);
}
return 0;
}
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
int a[100005];
int n, k;
bool C(int d){
ll cnt = 0;
for(int i=0; i<n; i++){
if(a[i] > d){
cnt += (a[i]-d + k-2)/(k-1); //注意除数不能为0
//if(cnt > d) return false;
}
}
if(cnt > d) return false;
else return true;
//return true;
}
int main(){
while(scanf("%d", &n) != EOF){
for(int i=0; i<n; i++)
scanf("%d", &a[i]);
sort(a, a+n);
scanf("%d", &k);
if(k == 1){
printf("%d\n", a[n-1]);
continue;
}
int lb = 0, ub = a[n-1];
while(ub - lb > 1){
int mid = (lb+ub)/2;
if(C(mid)) ub = mid;
else lb = mid;
}
printf("%d\n", ub);
}
return 0;
}