这个题是我在比赛的时候看到的。
开始的时候,身为菜鸟的我根本没想到用什么二分。。。。
后来从别人那里知道了以后就火速的敲代码,上交,结果WA。接着我继续搞代码,越搞越乱。
弄了好久也没弄出来
其实是我少了个特判。
那就是k=1的时候。因为k-1做了分母,所以k是不能等于1 的。
由于没找到弊病,所以我和以为同伴在源代码的基础上改了又改,连续交了12遍都没过。
最后。好吧。我们都放弃了。
第二天等头脑清醒了,才改掉错误终于AC了。
代码如下:
#include <cstdio> #include <cmath> #define M 100010 int a[M], n, k, m, max; int ok(int ans) { long long cnt = 0; for(int i = 0; i < n; i++) if(a[i]>ans) { int t = ceil(1.0*(a[i]-ans)/(k-1)); if(t>ans) return 0; cnt+=t; } return cnt<=(long long)ans*m; } int solve() { int l = 0, r = max, mid; if(k==1) return max; while(l<r) { mid = (r+l)>>1; if(ok(mid)) r = mid; else l = mid+1; } return l; } int main () { int cas; scanf("%d",&cas); while(cas--) { max = 0; scanf("%d",&n); for(int i = 0; i < n; i++) {scanf("%d",&a[i]); max = a[i]>max?a[i]:max; } scanf("%d%d",&m,&k); printf("%d\n",solve()); } return 0; }