题目链接
题意
环形跑道上有n个加油站,第i个加油站可以加Pi汽油,从i加油站开到下一个加油站需要Qi汽油。任务是选择一个加油站作为起点,可以走完一圈后回到起点。
解决
从1开始枚举,以每一个点作为起点,如果可以就输出答案;如果当前节点不可以作为出发点,说明到了某一个点tmp不能再继续向下走了,那么从起点到tmp的这些点也肯定不能作为起点。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int P[2*maxn],Q[2*maxn];
int main()
{
int cases,c=1;
scanf("%d",&cases);
while(cases--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&P[i]);
P[i+n]=P[i]; //这里用2*n的数组代替环路
}
for(int i=1;i<=n;i++){
scanf("%d",&Q[i]);
Q[i+n]=Q[i];
}
printf("Case %d: ",c++);
int bg=1;
bool ok=false;
while(bg<=n&&!ok)
{
int tmp=bg;
int ans=0;
while(1){
ans+=P[tmp];
ans-=Q[tmp];
if(ans<0) break;
tmp++;
if(tmp==bg+n){ //绕了一圈又回到出发点
printf("Possible from station %d\n",bg);
ok=true;
break;
}
}
bg=tmp+1;
}
if(!ok) printf("Not possible\n");
}
}