UVA 11093 Just Finish it up
题意:
一个环形跑道,每到一个站可以获得汽油,每到下一个站消耗一定的汽油,问标号最小的使得能够完成一次环形的起点站。
分析:
看的紫书,假设从第一个点出发最多能够到达p,那么从1到p的点就一定都不是起点了。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn=1000005;
int p[maxn],q[maxn];
int main()
{
int T;
scanf("%d",&T);
int cas=0;
while(T--)
{
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]);
int pos;
int i=0,flag;
while(i<n)
{
int ans=0;
flag=1;
for(int j=0;j<n;j++)
{
pos=(j+i)%n;
ans+=p[pos];
ans-=q[pos];
if(ans<0)
{
flag=0;
break;
}
}
if(flag)
break;
if(pos<i)
{
flag=0;
break;
}
i=pos+1;
}
printf("Case %d: ",++cas);
if(flag)
printf("Possible from station %d\n",i+1);
else
printf("Not possible\n");
}
return 0;
}