题目描述
环形跑道上有n(n <= 5000)个加油站,编号为1~n。第i个加油站可以加油p_i升。从加油站i开到下一站需要q_i加仑汽油(由于跑到是环形的,所以n号加油站的下一站是1号加油站)。你可以选择一个加油站作为起点,起始油箱为空(但可以立即加油)。你的任务是选择一个起点,使得可以走完一圈后回到起点。假定油箱的容量无限大。如果无解,输出Not possible,否则输出可以作为起点的最小的加油站编号。
输入格式
第1行:1个正数N,表示加油站的数量。
第2行:N个空格分隔的正整数,其中第i个整数p_i,表示加油站i的油量(1<=p_i <= 100000)。
第3行:N个空格分隔的正整数,其中第i个正整数q_i,表示从加油站i到下一站所需的油量 (1 <=q_i <= 100000)。
输出格式
输入输出样例
输入样例1:
7
1 1 1 10 1 1 1
2 2 2 2 2 2 2
输出样例1:
4
说明
1行:如果有解输出编号最小的解,否则输出“Not possible”
【耗时限制】1000ms 【内存限制】128MB
#include<iostream>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<sstream>
using namespace std;
int p[10086],q[10086];
int main()
{
int n,ans=0;
bool flag;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>p[i];
p[n+i]=p[i];
}
for(int i=1;i<=n;i++)
{
cin>>q[i];
q[n+i]=q[i];
}
for(int i=1;i<=n;i++)
{
ans=0;
flag=true;
for(int j=i;j<=i+n-1;j++)
{
ans+=p[j];
if(ans<q[j])
{
flag=false;
break;
}
ans-=q[j];
}
if(flag)
{
cout<<i;
return 0;
}
}
cout<<"Not possible";
return 0;
}