(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)

题目1:MC0227堆煤球

码题集OJ-堆煤球 (matiji.net)

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第1张图片

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第2张图片

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第3张图片

思路:

1.i从l枚举到r,i是8的倍数就跳过,i不是8的倍数就用等差数列求和公式i(1+i)/2,最后累加到答案中即可

AC_Code:C++

#include 

using namespace std;

int main( )
{
    int l,r;  cin>>l>>r;
    int ans=0;
    for(int i=l;i<=r;i++){
        if(i%8==0)  continue;   //注意这里是模8
        ans+=i*(1+i)/2; //等差数列求和公式
    }
    cout<

 

题目2:MC0228军团大战

码题集OJ-军团大战 (matiji.net)

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第4张图片

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第5张图片

思路:

1.找出字符数量最多,有多个输出字典序最小的那一个

2.开一个数组,统计每一个字母出现的次数

AC_Code:C++

#include 

using namespace std;

int main( )
{
    string  s;  cin>>s;
    vectorcnt(26); //统计每一个字符出现的次数
    int mx=0;
    for(char c:s){
        cnt[c-'A']++;
        mx=max(mx,cnt[c-'A']);
    }

    for(int i=0;i<26;i++)   //找到字典序最小的一个
        if(cnt[i]==mx){
            cout<<(char)(i+'A');
            return 0;
        }

    return 0;
}

 

题目3:MC0229武力对决

码题集OJ-武力对决 (matiji.net)

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第6张图片

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第7张图片

思路:

1.获得的最大经验值,用最大值减最小值得到

2.求最大值最小值,可以一趟遍历求得,也可以直接排序

AC_Code:C++

#include 

using namespace std;
int const N=1e5+7;

int a[N];
int n;

int main( )
{
    scanf("%d",&n);
    for(int i=0;i

 

题目4:MC0230小码哥教数学

码题集OJ-小码哥教数学 (matiji.net)

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第8张图片

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第9张图片

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第10张图片

思路:

1.互质就是最大公约数为1,让两组学生左移,就是取出最高一位,把它放到个位

AC_Code:C++

#include 

using namespace std;

int gcd(int a,int b){
    return b==0?a:gcd(b,a%b);
}

int main( )
{
    int a,b;    cin>>a>>b;
    
    int temp=a,n=0;
    while(temp) temp/=10,n++;
    int base=pow(10,n-1);   //10^(n-1)
   
    int ans=-1;
    for(int i=0;i

 

题目5:MC0231圣诞树上的星星

码题集OJ-圣诞树上的星星 (matiji.net)

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第11张图片

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第12张图片

思路:

1.3的倍数输出|,不是3的倍数第几行输出几个星星

AC_Code:C++

#include 

using namespace std;

int main( )
{
    int n;  cin>>n;
    for(int i=1;i<=n;i++){
        if(i%3==0)  puts("|");  //3的倍数
        else{
            for(int j=0;j

 

题目6:MC0232魔塔密码

码题集OJ-魔塔密码 (matiji.net)

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第13张图片

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第14张图片

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第15张图片

思路:

1.密码是由每隔k-1个字符组成的,相当于由下标索引模k等于0的所有字符组成

AC_Code:C++

#include 

using namespace std;

int main( )
{
    int k;  
    string s;   cin>>k>>s;
    for(int i=0;i

 

题目7:MC0233地狱尖兵

码题集OJ-地狱尖兵 (matiji.net)

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第16张图片

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第17张图片

input:

3
5 5
....P
##..E
K#...
##...
.....
5 5
P....
.....
..E..
.....
....K
5 5
P#..E
.#.#.
.#.#.
.#.#.
...#K

output:

No solution
12
No solution

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第18张图片

思路:bfs

1.小马妹先和其他小队回合,在一起前往制高点,先求P,K最短距离,再求K,E最短距离

2.求最短距离,可以跑一遍bfs,注意求P,K最短距离时要将制高点看成墙,表示不能通行

AC_Code:C++

#include 

using namespace std;
int const N=507;

char s[N][N];
bool vis[N][N];
int n,m;
int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
struct Node{
    int x,y,step;
};

int bfs(int x1,int y1,int x2,int y2){
    queueq;   q.push({x1,y1,0});
    memset(vis,0,sizeof vis);
    vis[x1][y1]=1;
    while(q.size()){
        Node temp=q.front();    q.pop();

        if(temp.x==x2&&temp.y==y2)  return temp.step;   //找到了终点

        for(int i=0;i<4;i++){
            int x=dx[i]+temp.x,y=dy[i]+temp.y;
            if(x<0||y<0||x>=n||y>=m)    continue;   //越界
            if(s[x][y]=='#'||vis[x][y])    continue;    //是墙,或者被遍历过
            q.push({x,y,temp.step+1});
            vis[x][y]=1;
        }
    }

    return -1;  //没有到终点
}

void solve(){
    scanf("%d%d",&n,&m);
    int px,py,kx,ky,ex,ey;
    for(int i=0;i>T;
    while(T--){
        solve();
    }
    return 0;
}

 

题目8:MC0234激光扫描游戏

码题集OJ-激光扫描游戏 (matiji.net)

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第19张图片

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第20张图片

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第21张图片

思路:

1.按要求模拟,遇到炸炸弹,变化扫描范围

AC_Code:C++

#include 

using namespace std;
int const N=1e3+7;

int n;
vectorg[N];    //g[i]:存的是第i的的炸弹

int main( )
{
    cin>>n;
    for(int i=0;i>x>>y;
        g[x].push_back(y);
    }

    int ans=0,r=499;
    for(int i=0;i<1000;i++){
        int cur_r=r;
        ans+=cur_r+1;

        //遇到炸弹,变化为:行-列
        for(int j:g[i]){
            if(cur_r>=j)    r=r+(i-j);
        }
        
        //扫描位置最大为999,最小为0
        if(r<0) r=0;
        if(r>999)   r=999;
    }

    cout<

 

题目9:MC0235数数游戏

码题集OJ-数数游戏 (matiji.net)

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第22张图片

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第23张图片

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第24张图片

思路:

1.从1枚举到n,分别统计满足要求的情况

AC_Code:C++

#include 

using namespace std;

//能被3整除或包含数字3
bool check3(int n){
    if(n%3==0)  return true;
    while(n){
        if(n%10==3) return true;
        n/=10;
    }
    return false;
}

//能被5整除或包含数字5
bool check5(int n){
    if(n%5==0)  return true;
    while(n){
        if(n%10==5) return true;
        n/=10;
    }
    return false;
}

int main( )
{
    int n;  cin>>n;

    int a=0,b=0,c=0;
    for(int i=1;i<=n;i++){
        if(check3(i)&&check5(i))    c++;    //规则一二都满足
        else{
            if(check3(i))   a++;    //满足规则一
            if(check5(i))   b++;    //满足规则二
        }
    }

    printf("%d\n%d\n%d\n",a,b,c);
    return 0;
}

 

题目10:MC0236跳跳棋

码题集OJ-跳跳棋 (matiji.net)

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第25张图片

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第26张图片

input:

4
4
2 3 5 8
2 3 5 8
2 3 5 8
2 3 5 8

output:

8

思路:模拟

1.模拟跳到的格子,是质数答案++

AC_Code:C++

#include 

using namespace std;
int const N=107;

int a[N][N];
int n,m;

//检查是否为质数
bool check(int n){
    for(int i=2;i<=n/i;i++)
        if(n%i==0)  return false;
    return true;
}

int main( )
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)   scanf("%d",&a[i][j]);
    
    int ans=0;
    int i=1,j=1;
    while(i<=n){
        if(check(a[i][j]))  ans++,j+=a[i][j]%10;   //是质数答案++
        else j++;   //不是质数向右跳一格
        if(j>m) i++,j=1;
    }   
    cout<

 

题目11:MC0237小狗巴克

码题集OJ-小狗巴克 (matiji.net)

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第27张图片

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第28张图片

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第29张图片

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第30张图片

思路:

1.对原字符串去除'!',得到一个新的字符串,然后用新的字符串调用find函数,查找目标字符串

AC_Code:C++

#include 

using namespace std;

int main( )
{
    string s,t; cin>>s>>t;
    
    string new_s;
    for(int i=0;i

题目12:

占时更新

题目13:MC0239小码哥玩字母独

码题集OJ-小码哥玩字母独 (matiji.net)

(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第31张图片(2023码蹄杯)省赛(初赛)第三场真题(原题)&(题解+AC代码)_第32张图片

思路:

1.开一个hash数组,将主对角线的字符,加入数组中,如果一个字符出现了两次,则输出refuse,并结束程序,如果到最后都没有出现相同的字符输出accept

AC_Code:C++

#include 

using namespace std;
int const N=107;

int n;
char str[N][N];
bool vis[26];   //hash数组

int main( )
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%s",str[i]+1);
    
    for(int i=1;i<=n;i++){
        char c=str[i][i];
        if(vis[c-'a']){ 
            puts("refuse"); //当前字符出现了2次了
            return 0;
        }
        vis[c-'a']=true;
    }

    puts("accept");
    return 0;
}

 

 

你可能感兴趣的:(码蹄集&百度之星,算法,数据结构)