zoukankan      html  css  js  c++  java
  • 10.29 上午考试

    P73

     

    竞赛时间:??????????:??-??:??

    题目名称

    第二题

    死亡

    凝视

    名称

    two

    death

    eyesight

    输入

    two.in

    death.in

    eyesight.in

    输出

    two.out

    death.out

    eyesight.out

    每个测试点时限

    1秒

    1秒

    1秒

    内存限制

    512MB

    512MB

    512MB

    测试点数目

    10

    10

    10

    每个测试点分值

    10

    10

    10

    是否有部分分

    题目类型

    传统

    传统

    传统

    注意事项(请务必仔细阅读):

     

                                                                 第二题

    【题目描述】

    给你两个日期,问这两个日期差了多少毫秒。

    【输入格式】

    两行,每行一个日期,日期格式保证为YYYY-MM-DD hh:mm:ss”这种形式。第二个日期时间一定比第一个日期时间要大两个日期的年份一定都是21世纪的年份。

    【输出格式】

    一行一个整数代表毫秒数。

    【样例输入1

    2000-01-01 00:00:00

    2000-01-01 00:00:01

    【样例输出1

    1000

    【样例输入2

    2000-01-01 00:00:00

    2000-11-11 00:00:00

    【样例输出2

    27216000000

    【样例解释】

    从前有座山。

    【数据范围与规定】

    对于的数据,两个日期相同。

    对于的数据,两个日期只有秒数可能不同。

    对于的数据,两个日期只有秒数、分钟数可能不同。

    对于的数据,两个日期的年月日一定相同。

    对于的数据,两个日期的年月一定相同。

    对于的数据,两个日期的年份一定相同。

    对于的数据,两个日期一定都是21世纪的某一天,且第二个日期一定大于等于第一个日期。

     

    /*
    60分少了个= 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define LL long long
    using namespace std;
    LL n1,y1,r1,s1,f1,m1;
    LL n2,y2,r2,s2,f2,m2;
    LL ans;
    LL month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    LL init()
    {
        LL x=0,f=1;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    LL judge(LL x)
    {
        if((x%4==0&&x%100!=0)||x%400==0)
          return 1;
        return 0;
    }
    void Deal()
    {
        if(m1==60)m1==0,f1++;
        if(f1==60)f1=0,s1++;
        if(s1==24)s1=0,r1++;
        if(judge(n1))month[2]=29;
        else month[2]=28;
        if(r1==month[y1]+1)r1=1,y1++;
        if(y1==13)y1=1,n1++;
    }
    int main()
    {
        //freopen("two.in","r",stdin);
        //freopen("two.out","w",stdout);
        n1=init(),y1=init(),r1=init(),s1=init(),f1=init(),m1=init();
        n2=init(),y2=init(),r2=init(),s2=init(),f2=init(),m2=init();
        if(m1!=m2)
        {
            if(m1<m2)ans+=m2-m1,m1=m2;
            else if(m1>m2)ans+60-m1+m2,m1=m2,f1++;
            Deal(); 
        }
        if(f1!=f2)
        {
            if(f1<f2)ans+=(f2-f1)*60,f1=f2;
            else if(f1>f2)ans+=(60-f1+f2)*60,f1=f2,s1++;
            Deal();
        }
        if(s1!=s2)
        {
            if(s1<s2)ans+=(s2-s1)*60*60,s1=s2;
            else if(s1>s2)ans+=(24-s1+s2)*60*60,s1=s2,r1++;
            Deal();
        }
        while(r1!=r2||y1!=y2||n1!=n2)
        {
            r1++;Deal();
            ans+=60*60*24;
        }
        cout<<ans*1000<<endl;
        return 0;
    }
    View Code

     

    /*
    刚开始少打了个等号 60分
    QAQ......
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define LL long long
    using namespace std;
    LL n1,y1,r1,s1,f1,m1;
    LL n2,y2,r2,s2,f2,m2;
    LL ans;
    LL month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    LL init()
    {
        LL x=0,f=1;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    LL judge(LL x)
    {
        if((x%4==0&&x%100!=0)||x%400==0)
          return 1;
        return 0;
    }
    void Deal()
    {
        if(m1==60)m1=0,f1++;
        if(f1==60)f1=0,s1++;
        if(s1==24)s1=0,r1++;
        if(judge(n1))month[2]=29;
        else month[2]=28;
        if(r1==month[y1]+1)r1=1,y1++;
        if(y1==13)y1=1,n1++;
    }
    int main()
    {
        freopen("two.in","r",stdin);
        freopen("two.out","w",stdout);
        n1=init(),y1=init(),r1=init(),s1=init(),f1=init(),m1=init();
        n2=init(),y2=init(),r2=init(),s2=init(),f2=init(),m2=init();
        if(m1!=m2)
        {
            if(m1<m2)ans+=m2-m1,m1=m2;
            else if(m1>m2)ans+=60-m1+m2,m1=m2,f1++;//+=打成了+ 
            Deal();
        }
        if(f1!=f2)
        {
            if(f1<f2)ans+=(f2-f1)*60,f1=f2;
            else if(f1>f2)ans+=(60-f1+f2)*60,f1=f2,s1++;
            Deal();
        }
        if(s1!=s2)
        {
            if(s1<s2)ans+=(s2-s1)*60*60,s1=s2;
            else if(s1>s2)ans+=(24-s1+s2)*60*60,s1=s2,r1++;
            Deal();
        }
        while(r1!=r2||y1!=y2||n1!=n2)
        {
            r1++;Deal();
            ans+=60*60*24;
        }
        cout<<ans*1000<<endl;
        return 0;
    }

     

     

    死亡

    【问题描述】

    现在有个位置可以打sif,有个人在排队等着打sif。现在告诉你前个人每个人需要多长的时间打sif,问你第个人什么时候才能打sif。(前个人必须按照顺序来)

    【输入格式】

    第一行两个整数如上所述

    接下来行每行一个整数代表每个人所需要用的时间。

    【输出格式】

    一行一个整数表示答案

    【样例输入】

    3 2

    1

    1

    1

    【样例输出】

    1

    【样例解释】

    山里有座庙。

    【数据规模与约定】

    对于的数据,每个人所需用的时间不超过。

    测试点

     

     

    测试点

     

     

    1

    10

    10

    1

    5000

    500

    2

    20

    10

    2

    100000

    5000

    3

    50

    10

    3

    100000

    10000

    4

    1000

    500

    4

    100000

    20000

    5

    2000

    500

    5

    100000

    50000

    /*
    贪心
    每个人都去时间最少的地方 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #define LL long long
    #define maxn 100010
    using namespace std;
    LL n,m;
    LL t[maxn];
    struct node
    {
        LL t;
        bool operator < (node a)const
        {
            return t>a.t;
        }
    };
    priority_queue<node>q;
    LL init()
    {
        LL x=0,f=1;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    int main()
    {
        freopen("death.in","r",stdin);
        freopen("death.out","w",stdout);
        n=init();m=init();
        for(LL i=1;i<=n;i++)
          t[i]=init();
        for(LL i=1;i<=m;i++)
          q.push((node){0});
        for(LL i=1;i<=n;i++)
        {
            node now=q.top();
            q.pop();
            now.t+=t[i];
            q.push(now);
        }
        node now=q.top();
        cout<<now.t<<endl;
        return 0;
    }

     

     

    凝视

    【问题描述】

    背包是个好东西,希望我也有。

    给你一个二维的背包,它的体积是。现在你有一些大小为和的物品,每个物品有自己的价值。你希望往背包里面装一些物品,使得它们的价值和最大,问最大的价值和是多少。

    【输入格式】

    第一行一个整数代表该测试点的数据组数。

    对于每组数据,第一行有四个整数,其中分别代表大小为和大小为的物品个数。

    接下来一行有个数代表每个物品的价值。

    接下来一行有个数代表每个物品的价值。

    【输出格式】

    对于每组询问,输出能够达到的价值最大值

    【样例输入】

    1

    2 3 2 2

    1 2

    1 2

    【样例输出】

    4

    【样例解释】

    庙里有座山。

    【数据规模与约定】

    对于的数据,。

    对于的数据,。

    对于的数据,。

    /*
    以为只能竖着放 打的dp 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define maxn 20010
    #define maxx 510
    using namespace std;
    int T,n,m,p,q;
    int w[maxn],v[maxn];
    int f[maxx][maxx];
    int init()
    {
        int x=0,f=1;char c=getchar();
        while(c<'0'&&c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    int main()
    {
        freopen("eyesight.in","r",stdin);
        freopen("eyesight.out","w",stdout);
        T=init();
        while(T--)
        {
            n=init();m=init();p=init();q=init();
            for(int i=1;i<=p;i++)
            {
                w[i]=2;
                v[i]=init();
            }
            for(int i=p+1;i<=p+q;i++)
            {
                w[i]=3;
                v[i]=init();
            }
            for(int i=0;i<=n;i++)
              for(int j=0;j<=m;j++)
                f[i][j]=0;
            for(int i=1;i<=p+q;i++)
            {
                for(int j=n;j>=1;j--)
                {
                    for(int k=m;k>=w[i];k--)
                    {
                        f[j][k]=max(f[j][k],f[j][k-w[i]]+v[i]);
                        f[j][k]=max(f[j][k],f[j-1][m]+v[i]);
                    }
                }
            }
            printf("%d
    ",f[n][m]);
        }
        return 0;
    }
    View Code

    正解

    /*
    
    这道题竟然不是dp
    贪心...
    对于一个n*m的网格
    放1*2和1*3的块
    若是枚举放多少1*2的和多少1*3的
    比如放x个1*2的和y个1*3的
    判断是否能放下 
    若能 肯定是取最大的那几个来填
    
    有如下结论:
    对于n*m的网格用足够1*3和1*2的块填能剩下1个或0个
    
    只需要枚举1*3放少个就行只要数*3<=格子就能放下
    (长或宽为2时除外单独讨论)
    
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define LL long long
    #define maxn 20010
    using namespace std;
    LL T,n,m,p,q,ans,sum,tot;
    LL a[maxn],b[maxn];
    LL s[maxn],t[maxn];
    LL init()
    {
        LL x=0,f=1;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    LL cmp(LL x,LL y)
    {
        return x>y;
    }
    LL min(LL x,LL y)
    {
        return x<=y?x:y;
    }
    int main()
    {
        freopen("eyesight.in","r",stdin);
        freopen("eyesight.out","w",stdout);
        T=init();
        while(T--)
        {
            n=init();m=init();p=init();q=init();
            for(LL i=1;i<=p;i++)
              a[i]=init();
            for(LL i=1;i<=q;i++)
                 b[i]=init();
               sort(a+1,a+p+1,cmp);
               sort(b+1,b+q+1,cmp);
               for(LL i=1;i<=p;i++)
                 s[i]=s[i-1]+a[i];
               for(LL i=1;i<=q;i++)
              t[i]=t[i-1]+b[i];
            if(n==2||m==2)
            {
                if(m==2)swap(n,m);ans=0;
                int l=m-m%3;l=l/3*2;
                for(LL i=0;i<=min(q,l);i++)
                   {
                       tot=n*m-i*3;
                       ans=max(ans,t[i]+s[min(p,tot/2)]);
                }
                cout<<ans<<endl;
                continue;
            }
            ans=0;
            for(LL i=0;i<=q;i++)
               {
                   if(n*m>=i*3)
                   {
                       tot=n*m-i*3;
                       ans=max(ans,t[i]+s[min(p,tot/2)]);
                }
                else break;
            }
            cout<<ans<<endl;
        }
        return 0;
    }

     

  • 相关阅读:
    Spring Boot从入门到精通(一)搭建第一个Spring Boot程序
    程序员未来的出路究竟在哪里?一位老码农的心声
    ​IntelliJ IDEA使用技巧—使用EasyCode插件一键生成代码04期
    浅谈Java后端开发工程师腾讯面试经历分享总结
    Java面试技巧—如何自我介绍
    互联网大厂Java面试题集—Spring boot常见面试题(二)
    互联网大厂Java面试题集—Spring boot面试题(一)
    ActiveMQ消息队列从入门到实践(4)—使用Spring JMS收发消息
    ActiveMQ消息队列从入门到实践(1)—JMS的概念和JMS消息模型
    有多少程序员干到35岁,那么其他人去干什么了?
  • 原文地址:https://www.cnblogs.com/dingmenghao/p/6011691.html
Copyright © 2011-2022 走看看