• CodeForces


    https://vjudge.net/problem/CodeForces-864C

    题意:两地之间有个加油站,往返走k个单程,最少加油多少次。

    大佬几十行代码就解决,我却要用一百多行的if语句模拟解决。

    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<math.h>
    #include<string>
    #include<queue>
    #define ll long long
    #define inf 0x3f3f3f3f
    using namespace std;
    
    ll a,b,f,k;
    ll one,two;///加油站左边路程为one,右边路程为two
    ll t;
    ll nowb;
    ll sum;
    
    int main()
    {
        while(scanf("%lld %lld %lld %lld",&a,&b,&f,&k)!=EOF)
        {
            one=f;
            two=a-f;
            nowb=b;            ///当前体力
            sum=a*k;           ///总路程
            t=0;               ///补充体力次数
            ll i;              ///当前走了多少路程
            bool flag=true;   ///能否走到
            int now=1;        ///now表示方向,1为右,-1为左
    
            for(i=0;i<sum;)///不加等于,不要i++
            {
                if(i==0)///刚出发
                {
                    if(nowb>=one)///能走到加油站
                    {
                        i+=one;
                        nowb-=one;
                    }
                    else///否则直接凉
                    {
                        flag=false;
                        break;
                    }
                }
                else if( k%2 && i==sum-two)///奇数次,最后向右,最后要走two这一段
                {
                    if(nowb>=two)///走得到
                    {
                        i+=two;
                        nowb-=two;
                    }
                    else///走不到,加完再看能不能到
                    {
                        nowb=b;
                        t++;
                        if(nowb>=two)
                        {
                            i+=two;
                            nowb-=two;
                        }
                        else
                        {
                            flag=false;
                            break;
                        }
                    }
                }
                else if( k%2==0 && i==sum-one)///偶数次,最后向左,最后要走one这一段
                {
                    if(nowb>=one)
                    {
                        i+=one;
                        nowb-=one;
                    }
                    else
                    {
                        nowb=b;
                        t++;
                        if(nowb>=one)
                        {
                            i+=one;
                            nowb-=one;
                        }
                        else
                        {
                            flag=false;
                            break;
                        }
                    }
                }
                else ///中间跑路,走两段one或者two
                {
                    if(now==1)///往右跑
                    {
                        if(nowb>=2*two)///跑得到,减油,改方向
                        {
                            i+=2*two;
                            nowb-=2*two;
                            now=-1;
                        }
                        else ///否则,加油
                        {
                            t++;
                            nowb=b;
                            if(nowb>=2*two)///加完看能不能跑到
                            {
                                i+=2*two;
                                nowb-=2*two;
                                now=-1;
                            }
                            else
                            {
                                flag=false;
                                break;
                            }
                        }
                    }
                    else ///往左跑
                    {
                        if(nowb>=2*one)
                        {
                            i+=2*one;
                            nowb-=2*one;
                            now=1;
                        }
                        else ///否则,加油
                        {
                            t++;
                            nowb=b;
                            if(nowb>=2*one)///加完看能不能跑到
                            {
                                i+=2*one;
                                nowb-=2*one;
                                now=1;
                            }
                            else
                            {
                                flag=false;
                                break;
                            }
                        }
                    }
    
                }
            }
            if(flag)
                printf("%d
    ",t);
            else
                printf("-1
    ");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    c#调用dll,::CoInitialize(NULL)出错
    使用 Anthem.NET 的常见回调(Callback)处理方式小结
    主题和皮肤学习
    得到任意网页源代码 (利用WebClient和WebRequest类)
    HTML marquee标签详解
    制作一个简单的天气预报
    CSS中的类class和标识id选择符(.和#号)
    String split '.'
    Map 的 clear() 方法会清空 Map对象
    sqLite 执行查询语句时报错__及SimpleCursorAdapter
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/10732498.html
Copyright © 2020-2023  润新知