记2019全国中医药院校程序设计竞赛——本校选拔赛

记2019全国中医药院校程序设计竞赛——本校选拔赛

哎,很遗憾最终没有被选上去郑州打比赛…
虽然未能代表学校参赛,但是自己刷题还是得继续,下一次选拔赛时一定要看到不一样的自己


选拔赛第一场


第一场只做出来四题,感觉做的不怎么顺手,有点紧张加上以前做过的题没做出来就心态有点崩了,然后昨天脑袋有点疼(不给自己找理由)

A:DNA Sorting

这一场没用百度翻译,导致看到英文题直接跳了,到过了一个小时左右才来看题,发现其实就是一道水题,
题意:对于字符串中的某一个字符求他后面比它小的字符个数,然后再求下和即可

#include
#include
#include
#include
struct node{
     
    char str[110];
    int cnt;
};
node a[110];
bool cmp(node x,node y){
     
    return x.cnt<y.cnt;
}
using namespace std;
int main(){
     
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++){
     
        scanf("%s",a[i].str);
        int ans=0;
        for(int j=0;j<n;j++){
     
            for(int k=j+1;k<n;k++){
     
                if(a[i].str[j]>a[i].str[k])
                    ans++;
            }
        }
        a[i].cnt=ans;
    }
    sort(a,a+m,cmp);
    for(int i=0;i<m;i++){
     
        printf("%s\n",a[i].str);
    }
    return 0;
}

这是刚刚写的,看了下比赛写的代码,虽然过了,但是感觉有点繁琐,直接用个结构体多简单,还是在比赛中容易紧张

B:杀人游戏

对于这道题,我不想说话,暑假刚做过的一道题,结果还是没做出来,自己还特地写过一篇博客。。。

https://blog.csdn.net/boliu147258/article/details/98793164


C:我是菜鸟,我怕谁

也是一道水题,本意就是等差数列求和。。。

#include
#include
#include
#include
#define ll long long
using namespace std;
int main(){
     
    int t;
    int n;
    scanf("%d",&t);
    while(t--){
     
        scanf("%d",&n);
        int sum=0;
        int an=1;
        for(int i=1;i<=n;i++){
     
            sum=(sum+an)%10000;
            an=(an+2)%10000;
        }
        printf("%d\n",sum);
    }
    return 0;
}

D:Asteroids

开始由于没翻译,导致题目都没咋看懂,直接就放弃了,待补…

E:Ugly Problem

待补

F:The Cow Lineup

待补

G:母牛的故事

一道水的不能再水的题

#include
#include
#include
#include
#include
#define ll long long
using namespace std;
ll fx(int n){
     
    if(n==1)
        return 1;
    else if(n==2)
        return 2;
    else if(n==3)
        return 3;
    else
        return fx(n-1)+fx(n-3);
}
int main(){
     
    int n;
    while(~scanf("%d",&n)){
     
        if(n==0)
            break;
        printf("%lld\n",fx(n));
    }
    return 0;
}

H:Bombing

待补

I:Minimal Power of Prime

待补

J:病毒入侵

其实标程应该是AC自动机,但是我看题目给定每个网站病毒数不大于三,于是就想用KMP算法,但是TLE。。。。

头铁的我 又试了试strstr函数,结果居然过了,皆大欢喜,hhhh

好像G++交不行,要C++交

#include
#include
#include
#include
using namespace std;
char str[510][210];
char ss[100010];
int a[10];
int main(){
     
    int n,m;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
     
        scanf("%s",str[i]);
    }
    scanf("%d",&m);
    int ans=0;
    for(int i=1;i<=m;i++){
     
        int cnt=0;
        int flag=0;
        scanf("%s",ss);
        for(int j=1;j<=n;j++){
     
            char *s;
            s=strstr(ss,str[j]);
            if(s==NULL){
     
                continue;
            }
            else{
     
                a[cnt]=j;
                flag=1;
                cnt++;
            }
            if(cnt>3)
                break;
        }
        if(flag==1){
     
            ans++;
            printf("web %d:",i);
            for(int j=0;j<cnt;j++){
     
                printf(" %d",a[j]);
            }
            printf("\n");
        }
    }
    printf("total: %d\n",ans);
    return 0;
}

补题的时候再用AC自动机做下


选拔赛第二场


一场想让我放弃ACM的冲动。。。。。

一道水题,wa我六次,直接原地爆炸,后面题目都看不进去了。。。。。。

A:Virtual Friends

感觉就是一个并查集,但是没做出来,待补

B:吃糖果
待补

C:Period

待补

D:整除的尾数

一道简单题,直接循环判断下即可

#include
#include
#include
#include
using namespace std;
int main(){
     
    int a,b;
    while(~scanf("%d%d",&a,&b)){
     
        if(a==0&&b==0)
            break;
        int num=a*100;
        int flag=0;
        for(int i=0;i<=99;i++){
     
            if((num+i)%b==0)
            {
     
                if(flag==0){
     
                    if(i<10){
     
                        printf("0%d",i);
                    }
                    else
                        printf("%d",i);
                    flag=1;
                }
                else{
     
                    if(i<10)
                        printf("0%d",i);
                    else
                        printf(" %d",i);
                }
            }
        }
        printf("\n");
    }
    return 0;
}

E:跑跑卡丁车

待补

F:RP问题

待补

G:Doing Homework again

明明知道是个DP题,但是就是没做出来。。。。

待补

H:素数回文

素数筛加上回文筛,但是没做出来…

待补

I:三角形

一道崩溃的题,不知道是眼瞎了,还是咋地,明明写的正数,偏偏看成了正整数…

#include
using namespace std;
int main(){
     
    double a,b,c;
    int t;
    scanf("%d",&t);
    while(t--){
     
        scanf("%lf%lf%lf",&a,&b,&c);
        double t;
        if(a>b){
     
            t=a;
            a=b;
            b=t;
        }
        if(a>c){
     
            t=a;
            a=c;
            c=t;
        }
        if(b>c){
     
            t=b;
            b=c;
            c=t;
        }
        if((a+b)>c&&(c-b)<a)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

J:Building Block

待补


选拔赛第三场


估计是学长学姐出的原创题,就前一个小时干了事,后面两个半小时,一道题都没A出来…

A:觉醒

题目描述一大截,开始直接没看,后面等A了两题后,再来看的这题,其实就是求中间中某点到原点的距离

#include
#include
#include
#include
#include
#include
#include
#define ll long long
using namespace std;
int main(){
     
    double a,b,c;
    int t;
    int n;
    scanf("%d",&t);
    while(t--){
     
        scanf("%d",&n);
        double d=0;
        for(int i=0;i<n;i++){
     
            scanf("%lf%lf%lf",&a,&b,&c);
            d=max(d,sqrt(a*a+b*b+c*c));
        }
        printf("%.2f\n",d);
    }
    return 0;
}

B:DJ的企鹅

赛后听大佬说,开始题目都没看懂的我麻了

待补

C:magia

题目讲的很明白了,就是判断一个数是不是回文串,我用字符串存的数,感觉这样好判断点

#include
#include
#include
#include
#include
#include
#define ll long long
using namespace std;
int main(){
     
    char str[100010];
    scanf("%s",str);
    int len=strlen(str);
    int flag=0;
    for(int i=0;i<len/2;i++){
     
        if(str[i]==str[len-i-1])
            continue;
        else{
     
            flag=1;
            break;
        }
    }
    if(flag==0){
     
        printf("%s\n",str);
    }
    else
        printf("-1\n");
    return 0;
}

D:multiplication

也很水,就是判断大小,注意下long long即可

#include
#include
#include
#include
#include
#include
#define ll long long
using namespace std;
int main(){
     
    ll a,b,c,d,e,f;
    scanf("%lld%lld%lld%lld%lld%lld",&a,&b,&c,&d,&e,&f);
    if(a*b*c>d*e*f){
     
        printf("1\n");
    }
    else if(a*b*c==d*e*f){
     
        printf("0\n");
    }
    else
        printf("-1\n");
    return 0;
}

E:来个板烧鸡腿堡吧!

不配吃板烧鸡腿堡的我,这题没做出来,一直wa,结果赛后看别人代码,核心代码五行不到,直接从后面遍历即可,我还想什么后缀和,屁。。。

待补

F: 漫无止境的八月

我直接用的map维护,感觉方便好多

#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
using namespace std;
map<ll,ll>mp;
int main(){
     
    ll n;
    ll num;
    scanf("%lld",&n);
    for(ll i=0;i<n;i++){
     
        scanf("%lld",&num);
        mp[num]++;
    }
    map<ll,ll>::iterator it;
    for(it=mp.begin();it!=mp.end();it++){
     
        printf("%lld %lld\n",it->first,it->second);
    }
    return 0;
}

G:梅干菜红烧肉加量扁粉加煎蛋加辣汤

直接对x,m,c相加求平均值,然后与c,m中的最小值 进行比较

如果最小值小于平均值,那么输出最小值

否则输出平均值

#include
#include
#include
#include
#define ll long long
using namespace std;
int main(){
     
    ll n;
    ll a,b,c;
    scanf("%lld",&n);
    for(int i=0;i<n;i++){
     
        scanf("%lld%lld%lld",&a,&b,&c);
        ll minnum=min(a,b);
        ll num=(a+b+c)/3;
        if(minnum<num){
     
            printf("%lld\n",minnum);
        }
        else
            printf("%lld\n",num);
    }
    return 0;
}

H:终局

感觉和hdu一道状压DP的题好像,但是我还是不会做。。。

待补

I:stick

待补

J:ski

待补


又快十二点了,这周就是把这三场的题目补完

虽然这次的确有点失望,而且感觉某些人成绩不真实 ,但是不管怎样,既然热爱就坚持到底,没刷个几百道题,能说自己努力过,参加过ACM??

大二这一年太重要了,不必在意别人的眼光,继续朝着目标奋斗!!!

你可能感兴趣的:(#,日常练习小结)