欢乐赛#44题解
2025-04-06 22:07:14
发布于:广东
ACGO欢乐赛#44题解
前言
这是本蒟蒻第一次写题解,请各位大佬们多多指点
注:个人代码习惯不喜欢写空格,敬请谅解。
本场欢乐赛整体难度太水了较为简单,评级如下。
| 题目 | 真实难度 | 个人难度 | 
|---|---|---|
| O | 入门 | 入门 | 
| 行图 | 入门 | 入门 | 
| 罚时计算 | 入门 | 入门 | 
| 困难的字符串改造问题 | 普及- | 入门 | 
| 追求更多的玫瑰花 | 入门 | 入门 | 
| 进制转换 | 入门 | 普及- | 
话不多说,直接开始——
题目解析
T1 -- O
知识点:输入输出
题目描述:要求出100以内的所有数中,哪一个数的“O”最多,数字 0,4,6,9 里面有 1 个 "O",数字 8 中有 2 个 "O"。
解析:其实题目中已经说得很明确了,对单一一个数字来说,8是有最多“O”的数,所以两位数88所含有的“O”最多,直接输出即可。
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
    cout << 88 << endl;
    return 0;
}
时间复杂度:O(1)
T2 -- 行图
知识点:循环结构,条件语句
题目描述:输入n个整数,第二个数开始,对于每个数,判断这个数是否为上一个数的因数,累计总数。
解析:定义一个num用来记录上一个数,一个sum用来统计数量,每次判断并累计数量。
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,a[100005];
    cin>>n;
    int num,sum=0;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    num=a[1];
    for(int i=2;i<=n;i++)
    {
        if(num%a[i]==0)
        {
            sum++;
            num=a[i];
        }
        else num=a[i];
    }
    cout<<sum<<endl;
    return 0;
}
时间复杂度:O(n)
T3 -- 罚时计算
知识点:循环结构
题目描述:输入n表示有n个人,随后对于每个人,输入m个数,表示每道题提交的次数,每道题除第一次提交外,随后的提交每多一次,罚时20min,求出每个人的总罚时。
解析:直接循环遍历即可,注意每次累加器清零。
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int sum=0;
        for(int j=1;j<=m;j++)
        {
            int a;
            cin>>a;
            sum+=(a-1)*20;
        }
        cout<<sum<<" ";
    }
    return 0;
}
时间复杂度:O(n*m)
T4 -- 困难的字符串改造问题
知识点:字符串
题目描述:输入一个字符串,每遇到一个空格,就将它替换成下一个字母(A到Z,Z下一个是A)。
解析:定义一个num记录目前遇到的空格数量,每次遇到空格就求现在应该替换的字母,并替换。注意输入处理,用getline,否则输入不了空格。
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    getline(cin,s);
    int num=0;
    for(int i=0;i<s.length();i++)
    {
        if(s[i]==' ')
        {
            num++;
            s[i]=char('A'+num-1);
            num=num%26;
        }
        cout<<s[i];
    }
    return 0;
}
时间复杂度:O(|s|)
T5 -- 追求更多的玫瑰花
知识点:输入输出,条件语句
题目描述:给定一个n个数的数组,其中的每一个数只能是1或-1,再有m次询问,每次给出两个数l和r,判断能否调整数组顺序使得[l,r]中的数加起来为0(即1与-1的数量相等),输出"happy"或"sad"。
解析:思维题。统计数组中1(变量zheng)与-1(变量fu)的数量,若区间有奇数个数,则直接输出"sad",否则判断有没有区间数量/2个1与-1,输出。
代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
int zheng,fu;
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int a;
        cin>>a;
        if(a==1) zheng++;
        else fu++;
    }
    for(int i=1;i<=m;i++)
    {
        int a,b;
        cin>>a>>b;
        int len=b-a+1;
        if(len%2==1) cout<<"sad"<<endl;
        else
        {
            len/=2;
            if(zheng>=len&&fu>=len) cout<<"happy"<<endl;
            else cout<<"sad"<<endl;
        }
    }
    return 0;
}
时间复杂度:O(n+m)
T6 -- 进制转换
知识点:进制转换,sort排序
题目描述:给定n个数,先将它们转换成八进制,随后:
- 先按照的最低位从大到小排序。
 - 如果最低位的数一样,那么就按这个数进行从小到大排序。
 
解析:将八进制的数存在数组b中(用十进制的方式存储,方便排序),再排序(用sort,写一个cmp),注意一定要开long long,否则会WA!!
代码
#include<bits/stdc++.h>
using namespace std;
long long n,a[200005],b[200005],x;
long long f(long long num) 
{
    long long res=0,sum=1;
    while (num>0) 
    {
        res+=(num%8)*sum;
        num/=8;
        sum*=10;
    }
    return res;
}
bool cmp(long long a,long long b)
{
    if(a%10!=b%10) return a%10>b%10;
    else return a<b;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        b[i]=f(a[i]);
    }
    sort(b+1,b+n+1,cmp);
    for(int i=1;i<=n;i++) cout<<b[i]<<" ";
    return 0;
}
时间复杂度:O(n log n)
最后,希望大家支持一下第一次写题解的我,AC君给个周边吧,谢谢!






全部评论 9
顶
2025-04-07 来自 广东
1顶
2025-04-07 来自 广东
1点个赞吧!
2025-04-06 来自 广东
1顶
2025-04-06 来自 广东
1顶
2025-04-06 来自 广东
1AC君,快看我的!
2025-04-06 来自 广东
1顶
2025-04-06 来自 广东
1顶
2025-04-06 来自 广东
1顶
2025-04-06 来自 广东
1










有帮助,赞一个