8-13 Just Finish it up uva11093
阿新 • • 發佈:2019-02-25
ret namespace += con pos 最小 possible 第一個 !=
題意:環形跑道上有n n<=100000 個加油站 編號為1-n 第i個加油站可以加油pi加侖 從加油站i開到下一站需要qi加侖 你可以選擇一個加油站作為起點 初始油箱為空 如果可以走完一圈 那麽輸出最小的起始站點 否則輸出-1
如果 對每個加油站作為起始點進行枚舉的話 那麽復雜度為 n^2
其中有一個重要的思路可以優化:
比如從第一個點最為起始點 如果能走一圈 那麽就成了 第一個也為最小起始點
如果 走到t點 t到t+1走不了 那麽 第2個點到 第t個點作為起始點 都是一定不可行的!!
接下來就將t+1作為起始點再次嘗試遍歷
#include<bits/stdc++.h> usingnamespace std; #define N 100001 int vis[N]; int p[N],q[N];//p為加油 q為油耗 int n; int go(int start) { int oil=p[start]-q[start]; if(oil<0) return start; for(int i=(start+1)%n; i!=start;i=(i+1)%n ) { oil+=p[i]-q[i]; if(oil<0)return i; } return N; }int solve(void) { int start=0; memset(vis,0,sizeof vis); vis[0]=1; for(;;) { int e=go(start); if(e==N)return start; start=e+1; if(vis[start])return -1; vis[start]=1; } } int main() { int cas;cin>>cas; for(intkase=1;kase<=cas;kase++) { cin>>n; for(int i=0;i<n;i++)scanf("%d",&p[i]); for(int i=0;i<n;i++)scanf("%d",&q[i]); int ans=solve(); printf("Case %d: ",kase); if(ans==-1)printf("Not possible\n"); else printf("Possible from station %d\n",ans+1); } return 0; }
LRJ的代碼更快更巧妙!
// UVa11093 Just Finish it up // Rujia Liu #include<cstdio> const int maxn = 100000 + 5; int n, p[maxn], q[maxn]; // returns s if success // otherwise, return the station you failed to reach // if you failed to reach the start, return -1 int go(int s) { int fuel = p[s] - q[s]; for(int i = (s+1)%n; i != s; i = (i+1)%n) { if(fuel < 0) return i; fuel += p[i] - q[i]; } if(fuel < 0) return -1; // this means sum(p) < sum(q), so this case is impossible return s; // success } int solve() { int start = 0; for(;;) { int finish = go(start); if(finish < start) return -1; // wrapped around, or go(start) returns -1 if(finish == start) return start; start = finish; } } int main() { int T; scanf("%d", &T); for(int kase = 1; kase <= T; kase++) { 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]); int ans = solve(); printf("Case %d: ", kase); if(ans < 0) printf("Not possible\n"); else printf("Possible from station %d\n", ans+1); } return 0; }
8-13 Just Finish it up uva11093