poj3232 - Accelerator(加速器)
这个题是我在比赛的时候看到的。
开始的时候,身为菜鸟的我根本没想到用什么二分。。。。
后来从别人那里知道了以后就火速的敲代码,上交,结果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;
}
浙公网安备 33010602011771号