POJ 3232 Accelerator
题目的意思大概是说现在你是跑跑卡丁车的队长,包括你在内有N个人,然后你每个时刻有M个加速器,加速器可以使你走k路程,1路程为你在没有加速器的情况下1时间所走,现在对于每名队员你知道他们距离终点的距离ai,那么现在队长的目的是让大家尽早到达终点,求最晚到终点的人的最早时间(好拗口的说法)
这道题目的数据范围是: N (1<= N <= 100000),Ai (1<= Ai <= 10^8) ,M and the K (1<= K*M <=10^8) ,测试时是多组数据测,T<=20
这道题目貌似discuss版里有很好的方法,我能想到的就是二分答案+check,check的写法也很无脑,当然我当时无脑写少了一句话:
if (tmp > t) return false;导致我wa了N次,无语了,discuss里面说的又k=1的情况和int64,我一直致力于这方面的修改,光改int64就改了n种版本,实在太挫了。
代码如下:
#include <cstdio> #define MAXN 100003 int T , N , M , K; int a[MAXN]; bool check(int t) { __int64 S = 0 , sum = (__int64)M * (__int64)t , temp , tmp; for (int i = 0;i < N;i++) { temp = a[i] - t; if (temp > 0) { tmp = temp / (K-1); if (temp % (K-1) != 0) tmp ++; if (tmp > t) return false; S += tmp; if (S > sum) return false; } } return true; } int main () { scanf("%d",&T); for (;T;T--) { int l = 1 , r = 0 , mid; scanf("%d",&N); for (int i = 0;i < N;i++) scanf("%d",&a[i]) , r = r < a[i] ? a[i] : r; scanf("%d%d",&M,&K); if (K > 1) { while (l <= r) { mid = (l+r) >> 1; if (check(mid)) r = mid-1; else l = mid+1; } printf("%d\n",l); } else printf("%d\n",r); } return 0; }
测试结果如下:
当然现在的程序很多地方冗余,主要是改的时候越改越长,都无语了。