UVA 11093 Just Finish it up 环形跑道 (贪心)

有一个环形跑道,上面有n个加油站,到i号加油站可以加pi的油,跑到下一站要花费qi的油,起点任意选,问是否有一个起点可跑完整个跑道。

从i开始跑,如果遇到某个站j不能跑了,那么从i到j之间的站开始跑,到j的油不会增加,所以下次直接从j+1开始跑。复杂度是O(n)

#include<bits/stdc++.h>
using namespace std;
#define bug(x) cout<<#x<<'='<<x<<endl;
const int maxn = 1e5+5;

int p[maxn], q[maxn];

int Run(int n)
{
    for(int st = 0; st < n; st++){
        int oil = 0;
        int i;
        for(i = 0; i < n; i++){
            int cur = (i+st)%n;
            oil += p[cur];

            if(oil<q[cur]){ st += i; break; }
            oil -= q[cur];
        }
        if(i == n) return st;
    }
    return -1;
}

int main()
{
    //freopen("in.txt","r",stdin);
    int T; scanf("%d",&T);
    for(int k = 1; k <= T; k++){
        int n;scanf("%d",&n);
        for(int i = 0; i < n; i++) scanf("%d",p+i);
        for(int i = 0; i < n; i++) scanf("%d",q+i);
        printf("Case %d: ",k);
        int ans = Run(n);
        if(~ans) printf("Possible from station %d\n",ans+1);
        else puts("Not possible");
    }
    return 0;
}

 

posted @ 2015-08-09 17:52  陈瑞宇  阅读(537)  评论(0编辑  收藏  举报