从1开始枚举起点,如果起点大于n了仍未找到答案,则确定无解。 r枚举终点,如果可以循环一圈回到起点,则输出l,否则,在某个r点汽油将小于0,那么从l到r的所有点都不可能是解,因为那样汽油量将更小,更无法完成r点到下一点的任务 。 如此这般就行了,需要注意的是如果r<l 时汽油<0了,那么必然无解。
#include<bits/stdc++.h> using namespace std; int T,n,p[100005],q[100005],kase=0; int main(){ scanf("%d",&T); while(T--){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&p[i]); for(int i=1;i<=n;i++) scanf("%d",&q[i]); int l=1,r=1; bool ok = false; printf("Case %d: ",++kase); while(l<=n) { int ans = 0; bool flage = true; while(r!=l||flage){ flage = false; ans+=p[r]; ans-=q[r]; if(ans<0) { if(l>r) goto loop; l = r+1; r = r+1; break; } else r++; if(r>n) r = 1; if(l==r) ok = true; } if(ok) { printf("Possible from station %d\n",l); break; } } loop: if(!ok) printf("Not possible\n"); } return 0; }
原文地址:http://blog.csdn.net/weizhuwyzc000/article/details/45824967