Just Finish it up
Time limit3000 ms
OSLinux
题意: 加油站问题,第一排给的是每个加油站可以加的油,第二排是2个加油站中间要消耗的油,开一圈。求离起点最近的可行解。
思路: 把每次到下个加油站后油量变化存一个数组,从第一个加油站开始,如果发现油量为负的了,就换第二个加油站开始,这样找到第一个可行的就输出。
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main(){ 4 int n; 5 int j,i; 6 cin>>n; 7 int x=1; 8 while(n--){ 9 int t; 10 cin>>t; 11 int add[t],del[t],c[t]; 12 for(i=0;i<t;i++){ 13 cin>>add[i]; 14 } 15 for(i=0;i<t;i++){ 16 cin>>del[i]; 17 } 18 for(i=0;i<t;i++){ 19 c[i]=add[i]-del[i]; 20 } 21 printf("Case %d: ",x++); 22 int num=0; 23 int now=0; 24 int k=0; 25 int k1=0; 26 while(now<t){ 27 28 int count=0; 29 int num=0; 30 for(i=now;i<t+now;i++){ 31 j=i; 32 if(j>=t) j-=t; 33 num+=c[j]; 34 if(num<0){ 35 now=j+1; 36 count=1; 37 break; 38 } 39 } 40 if(i!=j&&count==1) break; 41 if(count==0){ 42 k1=1; 43 cout<<"Possible from station "<<now+1<<endl; 44 break; 45 } 46 47 } 48 if(k1==0) 49 cout<<"Not possible"<<endl; 50 } 51 52 return 0; 53 }