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