环城汽车赛
XYZ城要举行一场汽车赛,因为XYZ城的巿长是个怪人,所以这次汽车赛有特殊的规则。在这次比赛的环形赛道上设有N个汽车加油站。选手可以选择任意一个作为起点。比赛开始时每辆汽车油箱里都没有油。在到达第i个加油站时了,汽车可以有那加Oi升的油。(我们设一升油可以开一km,并和速度无关)。所以加油站的油加起来正好可以开完全程。最快开完全程(逆时针)的选手将获得第一名。
当然,所有的选手都想夺冠,所以他们都想先知道从哪些加油站开始可以跑完全程。这个任务就交给你了!
Input
第一行为一整数T,表示有T组测试数据。每组测试数据二行。每组测试数据的第一行是一个数字N(4<=N<100000)
第二行是用空格分开的2N个整数,第一个数是第一个加油站可以提供的油O1升,第二个数是第一站到第二站距离D1km(N个站是逆时针排列的),……,最后一个是第N站个第一站的距离DNkm。(Oi,Di<=100000)
Output
对于每一组测试数据你输出一行两个数第一个数是一共有多少站可以那开始完成全程,第二个数是编号最小的可以完成全程的加油站的编号(如果第一个数是0这里输出-1)。
Sample Input
2
4
1 2 3 2 5 6 7 6
8
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
Sample Output
2 2
8 1
#include<iostream>
using namespace std;
struct oilstation
{
int oil,length;
oilstation *next;
};
int isOk(oilstation *phead);
int main()
{
int group,flag=0;//group--测试组数
int minstation[10],sumpos,sum[10];//minstation[i]--第i组可行加油站最小号码 sumpos--遍历到节点数 sum[i]--第i组可行加油站总数量
int station;//每组加油站总数
oilstation *head,*p,*q;
cin>>group;
//flag=0;
for(int i=0;i<group;i++)//信息输入
{
cin>>station;
head=new oilstation;
head->next=head;
cin>>head->oil>>head->length;
p=head;
for(int j=1;j<station;j++)
{
q=new oilstation;
cin>>q->oil>>q->length;
q->next=p->next;
p->next=q;
p=q;
}
minstation[i]=-1;
sum[i]=0;
sumpos=0;
if(isOk(head))
{
minstation[i]=1;
sumpos++;
sum[i]=1;
}
for(p=head->next;p!=head;p=p->next)
{
sumpos+=(sumpos==0)? 2:1;
if(isOk(p))
{
sum[i]++;
if(minstation[i]==-1)
minstation[i]=sumpos;
}
}
//cout<<sum[flag]<<" "<<minstation[flag]<<endl;
// flag++;
}
for(int j=0;j<group;j++)
cout<<sum[j]<<" "<<minstation[j]<<endl;
system("pause");
return 0;
}
int isOk(oilstation *phead)
{
oilstation *p=phead;
int toil=p->oil;
int tlength=p->length;
if(toil<tlength)
return 0;
for(p=phead->next;p!=phead;p=p->next)
{
toil+=p->oil;
tlength+=p->length;
if(toil<tlength)
return 0;
}
return 1;
}