标签:
有一个环形跑道,上面有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; }
UVA 11093 Just Finish it up 环形跑道
标签:
原文地址:http://www.cnblogs.com/jerryRey/p/4715522.html