题目大意:
n个加油站,编号1~n,第i个加油站可以加油pi加仑,开到下一站需要qi加仑,问是否可以选择一个编号尽量小的加油站为起点跑完所有一圈。
解题思路:
如果1234,到4不能走下去了,那么1234均不可能作为起点,以此为依据,遍历一边即可。
但是在最后不能将结果ans%n,如果ans是n的话,就会是0,因此应该是ans>n时,ans -= n;
AC代码:
#include<bits/stdc++.h>
#include <iostream>
#include <cstring>
#include <cmath>
#include <set>
#include <cstdio>
using namespace std;
typedef long long ll;
//#define ms(a,b) memset(a,b,sizeof(a))
//const int mod = 10056;
//const int maxn = 40;
//#define eps 1e-6
//int dp[maxn];
//char c[1010][1010];
int f[2010000];
int s[201000];
//int sum[101000];
//int cmp(int a, int b, int c, int d) {
// return (sum[a] - sum[b]) * (c - d) - (sum[c] - sum[d]) * (a-b);
//}
//ll c(int k) {
// if (k == 0){
// return 1;
// }
// else{
// return c(k-1) * 3;
// }
//}
//ll g(int k, ll l) {
// //cout << k <<" "<< l << endl;
// if (l == 0) {
// return 0;
// }
// if(k == 0) {
// return 1;
// }
// if(l >= (1<<(k-1))) return 2*g(k - 1, l - (1<<(k-1)) ) + c(k-1);
// else{
// return g(k - 1, l);
// }
//}
int main() {
//int a, b, k;
int t;
int n;
cin >> t;
int kase = 0;
while(t --) {
kase ++;
cin >> n;
int sum = 0;
int ans = 1;
int pos = 1;
for (int i = 1; i <= n; i++) {
cin >> f[i];
f[n+i] = f[i];
}
for (int i = 1; i <= n; i++) {
cin >> s[i];
s[n+i] = s[i];
}
int flag = 0;
int flag1 = 0;
int num = 0;
for (int i = 1; i <= 2*n; i++) {
//cout <<i << " " << flag << " "<< ans << " "<< sum <<" "<<sum+f[i]<<" "<< s[i]<< endl;
if (ans > n) {
break;
}
else if (i - ans >= n-1 && num >= n) {
//cout <<"num:" <<num<<endl;
flag = 1;
break;
}
else if (sum + f[i] < s[i]) {
// cout<<sum + f[i] << " "<<s[i]<<"---"<<endl;
ans = i+1;
sum = 0;
//flag1 = 0;
num = 0;
}
else {
num++;
//flag1 = 1;
//ans = i;
//cout <<"+++ " << endl;
sum = sum + f[i] - s[i];
}
}
//cout << flag << endl;
cout << "Case " << kase << ": " ;
if(!flag) {
cout << "Not possible" << endl;
}
else {
if(ans > n) {
ans -= n;
}
cout << "Possible from station " << ans<< endl;
}
}
}
//s