从第一个加油站开始枚举起点,如果到第i个加油站油量不够的话,那么1~i个加油站都不可能是起点。
将第i+1个加油站作为起点继续枚举。
比如说,第一个加油站开始最多跑到第5个加油站,那么第二个加油站不可能是起点。
因为第一个作为起点的话,到达第二个加油站油箱可能还有剩余,这样都跑不完一圈,所以从第二个站开始跑也就不可能跑完一圈。
1 #include <cstdio> 2 3 const int maxn = 100000 + 10; 4 int p[maxn * 2], q[maxn * 2]; 5 6 int main() 7 { 8 freopen("in.txt", "r", stdin); 9 10 int T; scanf("%d", &T); 11 for(int kase = 1; kase <= T; kase++) 12 { 13 printf("Case %d: ", kase); 14 15 int n; scanf("%d", &n); 16 for(int i = 0; i < n; i++) { scanf("%d", &p[i]); p[i+n] = p[i]; } 17 for(int i = 0; i < n; i++) { scanf("%d", &q[i]); q[i+n] = q[i]; } 18 19 bool flag = false; 20 int cur = 0, pos = -1, cnt = 0; 21 for(int i = 0; i < n;) 22 { 23 int cur = 0; 24 int j = i; 25 while(j < i + n && cur + p[j] >= q[j]) 26 { 27 cur += p[j] - q[j]; 28 j++; 29 } 30 if(j == i + n) { pos = i; break; } 31 i = j + 1; 32 } 33 34 if(pos >= 0) printf("Possible from station %d ", pos + 1); 35 else puts("Not possible"); 36 } 37 38 return 0; 39 }