2020 10 23 个人赛

C题:

落了一个条件,啊啊啊,就WA了!

思路:模拟,计算出加油站前的距离sum1和加油站后的距离sum2,然后模拟每一趟路程,如果此时的油量能够支撑到达下一趟的加油站,就不用加油,否则就需要加油,其中最后一趟需要特判(只需要和这一趟比较即可)。

另外看题解的时候学会了位运算的意义:a<<b:  a*(2^b)   a>>b:  a/(2^b)

代码如下:

#include<bits/stdc++.h>

using namespace std;

#define ll long long

int main()

{

   ll n,i,j,k;

   ll a,b,f;

   cin>>a>>b>>f>>k;

   if(f>b)

   {

       cout<<-1<<endl;

       return 0;

   }

   ll sum1,sum2;

   sum1=f-0;

   sum2=a-f;

   if(sum2>b)

   {

       cout<<-1<<endl;

       return 0;

   }

   ll tank=b;

   bool flag=1;

   ll ans=0;

   for(i=0;i<k-1;i++)

   {

       if(i&1)

       {

           if(tank<sum2)

           {

               flag=0;

               break;

           }

           else if(tank>=(a+sum1))

           {

               tank-=a;

           }

           else

           {

               ans++;

               tank=b-sum1;

           }

       }

       else

       {

           if(tank<f)

           {

               flag=0;

               break;

           }

           else if(tank>=(a+sum2))

           {

               tank-=a;

           }

           else

           {

               ans++;

               tank=b-sum2;

           }

       }

   }

   if(i&1)

   {

       if(tank<sum2)

       {

           flag=0;

       }

       else if(tank>=sum2&&tank<a)

       {

           ans++;

       }

       else

       {

           ;

       }

   }

   else

   {

       if(tank<sum1)

       {

           flag=0;

       }

       else if(tank>=sum1&&tank<a)

       {

           ans++;

       }

       else

       {

           ;

       }

   }

   if(flag==0)

   {

       cout<<-1<<endl;

   }

   else

   {

       cout<<ans<<endl;

   }

    return 0;

}

原文地址:https://www.cnblogs.com/chengxvzhishen/p/13908967.html