zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    在集群环境中使用 EhCache 缓存系统|RMI 集群模式
    oracle中的针对该库的表
    oracle:触发器,自治事务 trigger
    PL/SQL中查询某的时间段内所有执行的sql
    金额input框控制只能小数点后有两位的有效数字
    JS判断键盘上的上下左右键
    MySQL按照汉字的拼音排序
    JAVA经典总结
    普通for循环遍历LinkedList弊端
    EASYUI 1.4版 combobox firefox 下不支持中文检索的问题
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/10732498.html
Copyright © 2011-2022 走看看