CCF2018-12-2小明终于放学了

Posted awangkuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCF2018-12-2小明终于放学了相关的知识,希望对你有一定的参考价值。

2018-12-2的ccf测试题中,有一道小明放学的题,我写了两个方向的代码,在找不到逻辑的情况下都是60分,在此处浪费了很多时间,最后搜索时候听人说,原来60分的大部分是因为内存爆掉了,所以我改了类型为long int,不行,又改成了long long,终于通过了,不得不吐槽一下ccf的测试系统,明明出错也莫得错误类型提示,太为难胖虎了。

类型名称        字节数    取值范围
signed char       1        -128~+127
short int         2        -32768~+32767
int               4        -2147438648~+2147438647
long int          4        -2147438648~+2141438647
long long int  8      -9223372036854775808~+9223372036854775807

primer中long 32b     long long 64b

long int即long,给人的感觉好像是长整型,但实际上,它和int一样,只有32位。

既然long int与int相同,那么为什么还有long int这种尴尬的类型呢?
  原因是早期的C编译器定义了long int占用4个字节,int占用2个字节,long int是名副其实的长整型。在ANSI C的标准中,对长整型的定义也是long int应该至少和int一样长,而不是long int 一定要比int占用存储字节长。所以,正确的关系应该是——
long≥int≥short

  新版的C/C++标准兼容了早期的这一设定。
参考链接 https://blog.csdn.net/CV_Jason/article/details/85244813

#include <iostream>
using namespace std;
int main()
{
    int r,y,g;
    cin>>r>>y>>g;
    int n;
    cin>>n;
    int k,t;
    //分别是红灯,绿灯,黄灯 
    //其中黄灯也是不允许通过的 
    long long result=0;
    for(int i=0;i<n;i++)
    {
        cin>>k>>t;
        if(k==0)
        {
            result+=(long long)t;
        }
        else if(k==1)
        {
            //一开始的它是红灯
            //首先,我们先将多余的并不怎么影响判断的周期模掉
            long long a=result%(r+y+g);
             if(a<=t) //还须继续等待 
             {
                 result+=(long long)(t-a); 
             }
             else if(a-t>=g && a-t<=g+y) //过了等待的最佳时机 
             {
                 result+=(long long)(g+y+t-a+r);
             }
             else if(a>t+g+y)
             {
                 result +=(long long)(t+(r+g+y)-a);
             }
        }
        else if(k==2)
        {
            //一开始它是黄灯
            long long a=result%(r+y+g);
            if(a<=t)
            {
                result+=(long long)(t+r-a);
             } 
             else if(a>t && a<t+r)
             {
                 result+=(long long)(r-(a-t));
             }
             else if(a>=t+r+g && a<r+y+g) //再次与成功失之交臂 
             {
                 result+=(long long)(r+y+g-a+t+r);
             }
        }
        else if(k==3)
        {
            //一开始它是绿灯
            long long a=result%(r+y+g);
            if(a>t && a<=t+y+r)
            {
                result+=(long long)((r+y)-(a-t));
             } 
        }
    }
    cout<<result<<endl;
    return 0;
}

 

以上是关于CCF2018-12-2小明终于放学了的主要内容,如果未能解决你的问题,请参考以下文章

ccf 201812-2

CCF-CSP 201812 赛题训练

小明放学

201812-2 小明放学

CCF201909-1小明种苹果

小明上学