2020.9.25--2020中国大学生程序设计大赛总结

  1010.Reports

比赛做的一遍错误是遍历时超界了,用了俩for循环,其实用一个就行但当时没弄清楚就直接写了

题意:K每次进出学校都要进行上报,进校用“1”表示,出校为“0”,只有当两个连续的报告序列不同时报告才正确,否则错误。

解法:直接判断两个连续的数是否不同
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,i,s[100];
        cin>>n;
        for(i=0;i<n;i++)
        {
            cin>>s[i];
        }
        int k=0;
        for(i=0;i<n-1;i++)
        {
            if(s[i]==s[i+1])
            {
                k=1;
                cout<<"NO"<<endl;
                break;
            }

        }
        if(k==0)cout<<"YES"<<endl;
    }
}

1003.Express Mail Taking

题意:除了传统的课程,小火山还需要学习如何接快递。 

 

 快件通常存放在橱柜里。在小火山的学校里,有n个橱柜排在一排,编号1到n。相邻两个柜子之间的距离为1,入口在柜子1处。在n个机柜中,编号为k的机柜是特殊的,用来输入代码,从而打开机柜门。小火山有m快递要取,第i个在柜子ai里。两封快件不会存放在同一个柜子里。而且也没有特快专递。

解法:输入一次代码只能打开一个机柜,先取编号大的快件再取编号小的快件,可以发现;除了最后一个快递,其余快递都要从k出发到ai再返回k,所以要考虑最后一个快递的距离
#include<bits/stdc++.h>
#include<cstdio>
using namespace std;
如:10 2 5
        3 4
路线:      1-5       要走4
           5-4          1
           4-5          1
           5-1          4
总长为10
若要先取3号快件为:
           1-5          4
           5-3          2
           3-5          2
           5-1          4
总长为12
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        long long n,m,k,i,j;
        scanf("%lld%lld%lld",&n,&m,&k);
        long long s[m+5];
        for(i=0;i<m;i++)
        {
            scanf("%lld",&s[i]);
        }
        sort(s,s+m);//从小到大排列
        long long sum=0;
        for(i=m-1;i>=0;i--)
        {
            if(s[i]>k)
            {
                sum+=(s[i]-k)*2;
            }
            else
            {
                sum+=(k-s[i])*2;//此处多加了k与最小编号的快件的距离
            }
        }
        if(s[0]<k)
        {
            sum+=(k-1)*2;//加上一开始从1到k的距离以及从k返回到1的距离
            sum-=(k-s[0])*2;//当最小编号小于k时要减去k->ai及ai->k多加的距离
        }
        else
        {
            sum+=(k-1)*2;//最小编号大于k时直接加上1->k及k->1的距离
        }
        printf("%lld\n",sum);
    }
}

1007.CCPC Training Class

思路:找出字符串s中出现次数最多的那个字母的次数;

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t,j=1;
    cin>>t;
    while(t--)
    {
        string s;
        int i,m,b[1000]={0};
        cin>>s;
        m=s.size();
        int max=-1;
        for(i=0;i<m;i++)
        {
            b[s[i]-'a']++;
            if(b[s[i]-'a']>max)max=b[s[i]-'a'];
        }
        cout<<"Case #"<<j<<": "<<max<<endl;
        ++j;
    }
}

 

总结:1.因为最近一直没做题,一开始在打代码的时候就有点乱,思路还没有理清就直接做,要么写出来的代码繁琐出错要么就打了一点代码就接不下去了。 这次的组队赛,在开始前我就开始紧张还有点慌一直到比赛一半,就怕自己拖后腿做不出题来,比赛开始后,先看了通过率最高的1010题,打完代码提交后页面也没有直接显示对了还是错了,还以为对了也没查,忙着看下一道,但过一会我的队友也做了这道题对了,那我的肯定错了就开始想自己哪错了,想不出来就会有些烦躁,但也没继续看这道题,还要和队友看下一道题1003,这道题我们一开始讨论的思考方向错了,按照原来思路打出来的代码虽然样例对的上但也没过,后来就是在纸上重新换了一种思路,都忽略了题意是每取一个快件就要回到第k个机柜处输入代码,然后就分情况做,对于第三道题1007,题目没看懂,但光看样例的话就猜是找字符串中出现次数最多的字母的次数,直接上代码就过了.

        2. 对于这次比赛,这几个题看完题目思路是有但代码打出来就有些繁琐容易错,1010题就弄错了后来再看的时候发现遍历时超界了,还有就是打代码时还没理清大体步骤就打,思路就乱了,就会出现多余的没啥用的想法,导致代码会繁琐也容易出错,虽然都有思路但就是代码打的慢还不清晰。所以在做题时还是先理清思路了解了题意,再继续进行,还有就是在理解题意上想的简单化了忽略了一些细节问题,就像1003题一开始只想着距离忽略了要防止被偷需要一个一个取,和队友讨论后才意识到。还是要注意细节问题还有做题时得调整好心态,理清思路。还有就是有的题不能光看题目,有的题目直接看样例可能会更直接理解出题意,就像1007题。还有在纸上进行运算几步思路会更清晰,也可能会有更简单的方法可以解题。

posted @ 2020-09-26 22:45  西瓜0  阅读(244)  评论(0)    收藏  举报