Wiki_ki

导航

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;
}

  测试结果如下:

  当然现在的程序很多地方冗余,主要是改的时候越改越长,都无语了。

posted on 2012-07-31 21:07  Wiki_ki  阅读(200)  评论(0编辑  收藏  举报