题意:环形跑道给定n个加油站(n<=100000),编号从1到n,输入Pi表示第i个加油站可以加油Pi加仑,Qi表示第i到第i + 1个加油站消耗油量。初始油箱为空,求选择一个起点,使得可以走完一圈回到起点。如果无解输出Not possible,否则输出可以选择的最小起点。
思路:选择一号站,如果是,直接输出;如果不是,说明碰到某个加油站p,到p+1之间没油了。则有2、3、4……p一定不为解。因为在p到p+1肯定没油。直接枚举,复杂度为O(n)。
#include<cstdio>
int a[110000];
int b[110000];
int main(){
int kase = 0, T;
scanf("%d", &T);
while(T--){
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for(int i = 1; i <= n; i++)
scanf("%d", &b[i]);
int ans = 0, ans1 = 0, flag = 1, p = 1;
for(int i = 1; i <= n; i++){
ans = ans + a[i] - b[i];
if(ans < 0) { flag = 0; p = i + 1; ans1 += ans; ans = 0; }
}
printf("Case %d: ", ++kase);
if(ans + ans1 >= 0)printf("Possible from station %d\n", p);
else if(ans + ans1 < 0) printf("Not possible\n");
}
return 0;
}