2020中国大学生程序设计竞赛(CCPC)网络选拔赛总结

1010 Reports

题目意思和请假有关,但是本质上的要求是“当且仅当不存在两个连续且相同的报告时”,也就是1和0必须交错存在

做法先输入再判断即可

代码:

//去吧马里奥!把AC公主救回来!
//        ********
//       ************
//       ####....#.
//     #..###.....##....
//     ###.......######
//        ...........
//       ##*#######
//    ####*******######
//   ...#***.****.*###....
//   ....**********##.....
//   ....****    *****....
//     ####        ####
//   ######        ######
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<string>
#include<map>
#include<sstream>
#include<cstring>
#include<vector>
#include<iomanip>
#include<queue>
#include<set>
#define LL long long
#define _64 __int64
const double PI = atan(1.)*4.;
using namespace std;

const int maxx=1e6+1;
char s[maxx];
int a[maxx];
int main(){
    int n;
    scanf("%d",&n);
    while(n--){
        int len;
        cin>>len;
        for(int i=0;i<len;i++){
            cin>>a[i];
        }
        int flag=0;
        for(int i=1;i<len;i++){
            if(a[i]==a[i-1]){
                flag=1;
                break;
            }
        }
        if(flag==1){
            printf("NO\n");
        }else{
            printf("YES\n");
        }
    }
}

1003 Express Mail Taking

这个题的意思就是说有一排快递柜,是由1~n编号的,大门的位置在1好柜子处,其次有m封信,k号柜的地方可以获取密码,每次要取柜子里的东西都必须先到k号柜子的地方拿密码。

题目要求是给出一些柜子的编号,一个柜子只有一封信,问从门的地方出发拿到所有信并且返回门的位置的最短路径是多少

做法就是搞两个数组,将每一次过程拆成两个部分,第一个数组存从密码柜取到密码之后到柜子拿到信,再返回密码柜的距离;第二个数组存从密码柜到信封再回到初始地点的距离,循环比较,看看把哪个柜子作为最后一个最合适(因为中间的过程都是密码→柜子→密码)

如此就求出来了

(对了题目说了不能用cin,会超时)

代码:

//去吧马里奥!把AC公主救回来!
//        ********
//       ************
//       ####....#.
//     #..###.....##....
//     ###.......######
//        ...........
//       ##*#######
//    ####*******######
//   ...#***.****.*###....
//   ....**********##.....
//   ....****    *****....
//     ####        ####
//   ######        ######
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<string>
#include<map>
#include<sstream>
#include<cstring>
#include<vector>
#include<iomanip>
#include<queue>
#include<set>
#define LL long long
#define _64 __int64
const double PI = atan(1.)*4.;
using namespace std;

const int maxx=1e6+1;
int a[maxx],b[maxx],c[maxx];
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n,m,k;
        scanf("%d %d %d",&n,&m,&k);

        for(int i=0;i<m;i++){
            scanf("%d",&a[i]);
        }

        int minn=0;
        long long int sum=0;
        for(int i=0;i<m;i++){
            b[i]=abs(a[i]-k+a[i]-k);
            sum+=b[i];
            c[i]=abs(a[i]-k)+a[i]-1;
            if(i!=0&&(c[i]-b[i])<(c[minn]-b[minn])){
                minn=i;
            }
        }
        printf("%lld\n",sum+c[minn]-b[minn]+k-1);


    }
}

1007 CCPC Training Class

题目挺唬人的,意思是说取一个字符串,之后取出一部分来,要求取出来的这部分前半部分和后半部分相同,求取出来的最大长度

重点是最后一句话,说可以任意调整字符的位置,然后再看看样例,就蒙一蒙,找出字符串里重复次数最多的字符,把他们都移到前面去,这部分长度就是答案了

代码:

//去吧马里奥!把AC公主救回来!
//        ********
//       ************
//       ####....#.
//     #..###.....##....
//     ###.......######
//        ...........
//       ##*#######
//    ####*******######
//   ...#***.****.*###....
//   ....**********##.....
//   ....****    *****....
//     ####        ####
//   ######        ######
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<string>
#include<map>
#include<sstream>
#include<cstring>
#include<vector>
#include<iomanip>
#include<queue>
#include<set>
#define LL long long
#define _64 __int64
const double PI = atan(1.)*4.;
using namespace std;

const int maxx=1e6+1;
char s[maxx];
int main(){
    int n,num=0;
    scanf("%d",&n);
    num=n;
    while(n--){
        printf("Case #%d: ",num-n);
        scanf("%s",&s);
        int len=strlen(s);
        sort(s,s+len);
        int sum1=1;
        int sum2=0;

        for(int i=1;i<len;i++){
            if(s[i]==s[i-1]){
                sum1++;
            }else{

                sum2=max(sum1,sum2);
                sum1=1;
            }
        }
        printf("%d\n",sum2);
    }
}

至于……1011的那个矩阵,我是真的看不明白了……做的时候就一脸蒙,本来线代就学的不好吧,英语也不怎么样,所以研究了很久还没读懂题就放弃了

最后说说感觉

  1. 因为很多事情导致很久没正儿八经打过代码了,确实应该被教训一下,不能给自己找借口,一上手懵懵的,读题都得读半天,很不应该,应该将学习和训练提上日程了

  2. 做题方面的话,感觉一次不需要将题目读透,可以先看看样例,说不定就明白怎么做了(比如1007,真还就是这么出来的),某些题故意用很复杂的题干干扰,得学会看本质,看重要的内容,不然很可能迷失在英语阅读里,浪费时间,打击信心

  3. 很多题会给出类似提示之类的句子,比如1007和1003里都有类似的内容

  4. 总之的总之,接下来需要好好练了,自己欠缺的可不是一星半点,组队赛还可以团队合作,可一个人上就有些捉襟见肘了,不管什么时候,自己的实力永远是最重要的

    以上

上一篇:Struts2 原理


下一篇:LeetCode 53. 最大子序和 (java)