10.5题解(按难度递增)

I.谁获得了最高奖学金

上午讲的结构体原题,就简单的结构体应用 (没写出来的自己反思一下吧)

代码:略

H.字母统计

用一个数组来存一下字符串每一个字符出现的次数。

eg:asdfgas

用a[a]来存a的数量

最后在暴力吧数组遍历一遍,输出最多的一个

代码:略

G.小飞棍来喽!

就是字符串判断,本题唯一值得注意的就是要提前判断一下字符串的长度,不然会超时,同时xiaofeigunlailou必须匹配,不能出现多的字符。

eg:xiaofeigunlailoua 这是不符合的

代码:略

D 咩咩数数字

本题纯暴力,最直接的从100-999跑一遍,然后他的2倍3倍的数,把每一位都分解下来,看是不是123456789这几个数字只出现一次,即可。(甚至可以自己手写)

代码:略

F.换ID是吧

利用桶排记录出现了多少种字符串,然后再用总数直接减去字符串的种类就行了。()

#include<stdio.h>
#include<iostream>
#include<map>
#include<string.h>
#include<set>
using namespace std;
map<string,int>ma;
set<string>s;
char str[11];
struct node{
    char str[11];
    int sum=0;
}p[1000];
int main()
{
    int n;
    scanf("%d",&n);
    int cnt=0;
    while(n--)
    {
        int flag1=0;
        memset(str,0,sizeof(str));
        scanf("%s",str);
        for(int i=1;i<=cnt;i++)
        {
            int flag=0;
            for(int j=0;j<11;j++)
            {
                if(str[j]!=p[i].str[j])
                {
                    flag=1;
                    break;
                }
            }
            if(flag==0)
            {
                p[i].sum++;
                flag1=1;
            }
        }
        if(flag1==0)
        {
            cnt++;
            int s=strlen(str);
            for(int i=0;i<s;i++)
            {
                p[cnt].str[i]=str[i];
                p[cnt].sum=1;
            }
        }
    }
    int ans=0;
    for(int i=1;i<=cnt;i++)
    {
        if(p[i].sum>1)
        {
            ans+=p[i].sum-1;
        }
    }
    printf("%d",ans);
}

E.数的性质

先写个埃氏筛,把所有质数筛出来,再根据题意判断。

C 圈圈自己跟自己玩石头剪刀布

按照题意直接把得分表打出来,n作为时间倒计时,然后不断取模循环,访问得分表算累计得分就行。

代码(卫叔提供)

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200 + 10;
int n, na, nb, a[MAXN], b[MAXN], cnta, cntb;
int vs[5][5] = {{0,0,1,1,0},{1,0,0,1,0},{0,1,0,0,1},{0,0,1,0,1},{1,1,0,0,0}}; //得分表的处理 
int main()
{
    cin >> n >> na >> nb;
    for(int i = 0; i < na; i++) cin >> a[i];
    for(int i = 0; i < nb; i++) cin >> b[i];
    for(int i = 0; i < n; i++)
    {
        cnta += vs[a[i % na]][b[i % nb]]; //周期循环 
        cntb += vs[b[i % nb]][a[i % na]];
    }
    cout << cnta << " " << cntb << endl;
    return 0;
}

代码(xueque)

#include<stdio.h>
int main()
{
    long long n,r,l;
    long long jr=0,jl=0;
    scanf("%lld %lld %lld",&n,&l,&r);
    long long L[l+1],R[r+1];
    for(long long i=1;i<l+1;i++)
    {
        scanf("%lld",&L[i]);
    }
    for(long long i=1;i<r+1;i++)
    {
        scanf("%lld",&R[i]);
    }
    long long ll[n+1],rr[n+1];
    L[0]=L[l];
    R[0]=R[r];
    for(long long i=1;i<=n;i++)
    {
        ll[i]=L[i%l];
        rr[i]=R[i%r];
    }
    for(long long i=1;i<=n;i++)
    {
        if(ll[i]==0)
        {
            switch(rr[i])
            {
                case 1:jr++;break;
                case 2:jl++;break;
                case 3:jl++;break;
                case 4:jr++;break;
            }
        }
        else if(ll[i]==1)
        {
            switch(rr[i])
            {
                case 0:jl++;break;
                case 2:jr++;break;
                case 3:jl++;break;
                case 4:jr++;break;
            }
        }
        else if(ll[i]==2)
        {
            switch(rr[i])
            {
                case 0:jr++;break;
                case 1:jl++;break;
                case 3:jr++;break;
                case 4:jl++;break;
            }
        }
        else if(ll[i]==3)
        {
            switch(rr[i])
            {
                case 0:jr++;break;
                case 1:jr++;break;
                case 2:jl++;break;
                case 4:jl++;break;
            }
        }
        else if(ll[i]==4)
        {
            switch(rr[i])
            {
                case 0:jl++;break;
                case 1:jl++;break;
                case 2:jr++;break;
                case 3:jr++;break;
            }
        }   
    }
        printf("%lld %lld ",jl,jr);
        return 0;
}

B 于绝望之中创造希望的yq

用一个字符数组mi记录A到Z对应的密码,遍历已知的密码长度,遇见这个位置没有对应的密码,或有对应的密码但和要输入的不同时停止遍历(停止后为破译失败),若破译成功,则对这个字符数组mi从A到Z位遍历,如果有某一位没有对应密码或与先前对应密码重复停止遍历(停止后位破译失败)。 输出:若先前失败过则failed,若无失败则遍历yq被要求破解的字符串的每一位,输出其在mi中对应的密码。****(yq提供)

代码(yq)

#include<stdio.h>
#include<string.h>
#include<math.h>
const int maxn=1e7;
char mi[maxn],yuan[maxn],hou[maxn],yq[maxn];
int ceshi[maxn];
int main()
{
    for(int i='A';i<='Z';i++){
        mi[i]='!';
    }
    scanf("%s",hou);
    scanf("%s",yuan);
    scanf("%s",yq);
    int len=strlen(yuan),re=1;
    for(int i=0;i<len;i++){
//          printf("%d ",re);
        if(mi[hou[i]]=='!'||mi[hou[i]]==yuan[i]){
            mi[hou[i]]=yuan[i];
        }else{
            re=0;
            break;
        }
    }
    
    if(re!=0){
        for(int i='A';i<='Z';i++){
            if(mi[i]=='!'||ceshi[mi[i]]!=0){
                re=0;
                break;
            }else{
                ceshi[mi[i]]++;
            }
        }
    }
    if(re==0){
        printf("Failed");
    }else{
        int len1=strlen(yq);
        for(int i=0;i<len1;i++){
            printf("%c",mi[yq[i]]);
        }
    }
    return 0;
}

A 4眼鸟还在看蚂蚁感悟人生

本题属于思维题。当两只蚂蚁碰一起时 ,会互相掉头。但是从我们的视角来看。掉头时间不计,也就是两只蚂蚁擦肩而过。这样理解的话,就把问题转化成了一只蚂蚁无障碍下桥,最小值就是每个位置的蚂蚁直接下去的最小值的最大值。最大值同理类推,只需继续算出每只蚂蚁下去的最大时间取最大值即可。****(ZIFEI提供)

代码(ZIFEI)

#include<stdio.h>
#include<algorithm>
using namespace std;
int a[100000];
int main()
{
    int l,n;
    scanf("%d %d",&l,&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    int nmax=0;
    int nmin=0;
    for(int i=1;i<=n;i++)
    {
        nmin=max(nmin,min(a[i],l-a[i]+1));
        nmax=max(nmax,max(a[i],l-a[i]+1));
    }
    printf("%d %d",nmin,nmax);
}

0 comments

No comments so far...