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

题目1:MC0214捡麦子

码题集OJ-捡麦子 (matiji.net)

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

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

思路:

1.第n米在前n-1米的基础上多加一个n个麦子,那么直接从1开始枚举,累加答案即可

AC_Code:C++

#include 

using namespace std;

int main( )
{
    int n;  cin>>n;
    
    int ans=0,sum=0;
    for(int i=1;i<=n;i++){
        sum+=i;
        ans+=sum;
    }
    cout<

题目2:MC0215小码哥玩游戏

码题集OJ-小码哥玩游戏 (matiji.net)

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

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

思路:

简述题意:统计给定字符的相邻字符的数量,注意结果要去重

1.可以将给定字符的四个相邻字符,放到set中,最后直接输出set大小

AC_Code:C++

#include 

using namespace std;
int const N=107;

int n,m;
char ch;
char str[N][N];
int dx[]={-1,1,0,0},dy[]={0,0,-1,1};

int main( )
{
    cin>>n>>m>>ch;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)   cin>>str[i][j];
    }

    sets;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(str[i][j]!=ch)  continue;    //不是指定字符
            for(int k=0;k<4;k++){
                int x=dx[k]+i,y=dy[k]+j;
                if(x<1||y<1||x>n||y>m)  continue;
                if(str[x][y]=='0'||str[x][y]==ch)    continue;  //0是无字符,且不能与指定字符一致
                s.insert(str[x][y]);
            }
        }
    }

    cout<

题目3:MC0216淘金者

码题集OJ-淘金者 (matiji.net)

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

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

思路:

1.查找第一个给定字符,找到直接输出其下标+1,遍历完都没有找到输出-1

AC_Code:C++ 

#include 

using namespace std;

string s;
char target;

int main( )
{
    cin>>s>>target;

    for(int i=0;i

题目4:MC0217自动浇花机

码题集OJ-自动浇花机 (matiji.net)

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

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

思路:

1.左边的喷头的浇花的速度是右侧的两倍,那么相当于右侧的喷头浇花花费时间是左边的两倍

2.那么可以枚举分割点,左侧左喷头浇,右侧右喷头浇,满足左侧花费的时间<=右侧花费时间的两倍,分割点++

3.计算左右两侧的花费时间可以用前缀和优化

AC_Code:C++ 

#include 

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

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

int main( )
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",a+i);
        pre[i]=pre[i-1]+a[i];
    }

    //枚举分割点
    int idx=1;
    while(pre[idx]<=(pre[n]-pre[idx+1])*2)  idx++;
    cout<

题目5:MC0218小码哥的开心数字

码题集OJ-小码哥的开心数字 (matiji.net)

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

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

思路:

1.反转之后比较大小即可,

2.怎么反转呢?假设a=123,b=0,b为反转后的数字,每次令b=b*10+a%10,最后就可以得到a反转后的数b

AC_Code:C++ 

#include 

using namespace std;

int main( )
{
    int a;  cin>>a;
    int temp=a,b=0; //b为反转后的数
    while(temp){
        b=b*10+temp%10;
        temp/=10;
    }
    cout<

题目6:MC0219自驾游

码题集OJ-自驾游 (matiji.net)

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

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

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

思路:bfs

1.以路程0为起点,加油站的距离与money为限制,跑一个最短路,这里可以直接跑bfs

2.跑bfs时,要记录上一个加油站的下标索引,加快bfs的效率

AC_Code:C++ 

#include 

using namespace std;
typedef pairPII;
#define x first
#define y second
int const N=2007;

PII a[N];
int n,l,mx,s;
struct Node{
    int dist,money,idx;
};

bool bfs(){
    queueq;   q.push({0,s,-1});

    while(q.size()){
        Node t=q.front();    q.pop();
        
        if(t.dist+mx>=l)    return true;    //总行程已达L 

        //这里记录了上一次加油的下标
        for(int i=t.idx+1;it.dist+mx)    break;  //距离太远,无法到达
            if(a[i].y>t.money)  continue;   //钱不够加油
            q.push({a[i].x,t.money-a[i].y,i});
        }
    }

    return false;   //总行程无法达到达L 
}

int main( )
{
    while(cin>>n>>l>>mx>>s){
        for(int i=0;i>a[i].x>>a[i].y;
        sort(a,a+n);    //对距离升序排列

        if(bfs())   puts("Yes");
        else puts("No");
    }
    return 0;
}

题目7:MC0220买月饼

码题集OJ-买月饼 (matiji.net)

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

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

思路:

1.枚举买月饼的个数,对总费用分情况讨论,总费用小于10元,只有代金券面额刚好等于总费用符合条件

2.总费用大于10元时,总费用刚好为10的倍数,或者个位数刚好等于代金券的面额,就满足条件

AC_Code:C++ 

#include 

using namespace std;

int main( )
{
    int m,n;    cin>>m>>n;
    for(int i=1;;i++){
        int money=i*m;
        if(money<10){   //总费用小于10元
            if(n==money){
                cout<

题目8:MC0221未来战争

码题集OJ-未来战争 (matiji.net)

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

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

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

思路:

1.用差分对充能段标记为1,同时记录充能起点和终点

2.最后统计充能段的最大值,与非充能段的最大值,

3.最后充能段要记得减一,非充能段要加一,因为算的是区间

AC_Code:C++ 

#include 

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

int n;
int diff[N];

int main( )
{
    scanf("%d",&n);
    int start=1e6+7,target=-1;  //记录起点与终点
    for(int i=0;i

题目9:MC0222文章压缩

码题集OJ-文章压缩 (matiji.net)

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

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

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

思路:

1.对每个单词,记录它在第几次出现过

2.最后按要求输出即可

AC_Code:C++ 

#include 

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

string str[N];
int n;
unordered_map>idx;   //记录单词出现的位置

int main( )
{
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>str[i];
        idx[str[i]].push_back(i);
    }

    unordered_setvis;   //标记是否输出过单词
    for(int i=1;i<=n;i++){
        if(vis.count(str[i]))   continue;   //输出过了
        vis.insert(str[i]);

        vectory=idx[str[i]];
        cout<

题目10:MC0223魔法水晶球

码题集OJ-魔法水晶球 (matiji.net)

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

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

思路:

1.先检查是否为质数,在判断奇偶数

AC_Code:C++ 

#include 

using namespace std;

bool check(int n){
    for(int i=2;i<=n/i;i++)
        if(n%i==0)  return false;
    return true;
}

int main( )
{
    int n;  cin>>n;
    if(check(n))    puts("P");
    else if(n%2)    puts("O");
    else puts("E");
    return 0;
}

题目11:MC0224手机测试

码题集OJ-手机测试 (matiji.net)

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

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

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

思路:

1.按要求模拟,但是要注意t1时间段也算是性能模式,还有就是注意计算的是时间段

AC_Code:C++ 

#include 

using namespace std;

int a,m,n,k,t1,t2;

int main( )
{
    cin>>a>>m>>n>>k>>t1>>t2;

    int ans=0;
    int pre_r=-1;   //记录前一段的结束时间
    for(int i=0;i>l>>r;
        ans+=(r-l)*m;   //性能模式
        if(pre_r!=-1){
            int len=l-pre_r;    

            //性能模式
            if(len>=t1){
                len-=t1;
                ans+=t1*m;
            }
            else{
                ans+=len*m; pre_r=r; continue;
            }

            //正常模式
            if(len>=t2){
                len-=t2;
                ans+=t2*n;
            }
            else{
                ans+=len*n; pre_r=r; continue;
            }

            //省电模式
            ans+=k*len;
        }
        pre_r=r;
    }
    cout<

题目12:MC0225银河贸易市场

题解:MC0225银河贸易市场(码蹄杯)-CSDN博客

题目13:MC0226双人成行

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

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

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

思路:

1.把小马哥,小马弟做的题目放到一个集合中,看是否等于n

AC_Code:C++

#include 

using namespace std;

int n,m;
sets;

void get(){
    cin>>m;
    for(int i=0;i>n;
    get();  //小马哥的题
    get();  //小马弟的题
    
    if(s.size()==n) puts("It Takes Two.");
    else puts("Maybe Next Time.");
    return 0;
}

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