Logo 快乐的熊果的博客

博客

2025假期赛题解

2025-08-25 11:29:41 By 快乐的熊果

前言:有亿点点题没做完,后面应该也许大概会补

第一题:easy,照题意模拟就行有80%的人都对了(比赛5个人),注意判断的时间是2024年(今夕是何年?)

代码如下:

#include<bits/stdc++.h>
using namespace std;
int n;
int main(){
    cin>>n;
    while(n--){
        int t;
        cin>>t;
        if(t<2024){
            if(t%4==0&&t%100!=0||t%400==0){
                printf("%d was a leap year.\n",t);
            }
            else{
                printf("%d was a common year.\n",t);
            }
        }
        else if(t==2024){
            if(t%4==0&&t%100!=0||t%400==0){
                printf("%d is a leap year.\n",t);
            }
            else{
                printf("%d is a common year.\n",t);
            }
        }
        else if(t>2024){
            if(t%4==0&&t%100!=0||t%400==0){
                printf("%d will be a leap year.\n",t);
            }
            else{
                printf("%d will be a common year.\n",t);
            }
        }
    }
    return 0;
}

第二题:这题看着很复杂,其实很简单,给你商品价格并且告诉你买b送一,然后问你买X件应该买多少,可以省多少钱。(但是没人AC)

买多少依然简单,设买xXb件(X是乘号因为helloworld使用的神奇HTML写星号是斜体),我们要让xXb+x<购买总件数且x取最大值(不是购买总件数直接除以b不然会有免费的件数被浪费),接下来算省了多少和送几个非常简单

But,这题有几个坑人点要注意:1.商品名称有空格,记得用getline

2.商品价格给的美分有点奇妙,正常来说18美分=0.18美元,所以很容易写成价格=美元+美分/100,但是本题在美分处如果输入一个3却是0.3美元而不是0.03美元

3.如果你买了xXb件,免费的件数不等于x,比如一共有20件,每买6件送一件,那么买三个六件实际上只帮你免费了2件而不是3件,所以省的件数要注意判断是取x件还是(总件数-xXb)件。

然后没什么了,但是这题没有一个人AC,所以这里只有60分代码(改了几遍没改出来):

#include<bits/stdc++.h>
using namespace std;
string s;
double pd,pc;
int b;
int e;
int pf(int x){
    int sum=1;
    if(x<=e){
        return x;
    }
    else{
        while(b*sum+sum<=x){
            sum++;
        }
        sum--;
    }
    int ans=sum*b;
    ans+=(x-ans-sum);
    return ans;
}
double sav(int fre){
    double c=pd;
    if(pc/10>=1){
        c+=pc/100;
    }
    else{
        c+=pc/10;
    }
    return c*fre;
}
int main(){
    getline(cin,s);
    cin>>pd>>pc;
    cin>>b;
    cin>>e;
    cout<<s<<endl;
    while(e--){
        int t;
        cin>>t;
        int ans1=pf(t);//买多少
        int ans2=min(ans1/b,t-ans1);//送几件
        double ans3=sav(ans2);//省多少钱
        printf("Buy %d, pay for %d, get %d free. Save $%.2f.\n",t,ans1,ans2,ans3);
    }
    return 0;
}

第三题简单到爆,一个xXy的表格里面有若干件东西分布在任意处,然后问你在若干处地方一共有多少件东西,用一个数组a[x][y]表示在(x,y)处有几件东西,询问时把数量加起来就行

代码:

#include<bits/stdc++.h>
using namespace std;
int x,y;
int m;
int a[101][101];
int n;
int sum=0;
int main(){
    cin>>x>>y;
    cin>>m;
    memset(a,0,sizeof(a));
    for(int i=1;i<=m;i++){
        cin>>x>>y;
        a[x][y]++;
    }
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>x>>y;
        sum+=a[x][y];
    }
    cout<<sum;
    return 0;
}

第四题也简单,8场比赛,告诉你每场比赛几比几,然后按照规则加分和记录进球平局

但是我有一个小小的问题:题目说了如果没有进球平局,则显示一行:No scoring draws,但是加上这句话60分:

#include<bits/stdc++.h>
using namespace std;
string s[9];
int sum=0;
bool f[9];
bool none=true;
int main(){
    memset(f,false,sizeof(f));
    getline(cin,s[1]);
    for(int i=2;i<=8;i++){
        getline(cin,s[i]);
    }
    for(int i=1;i<=8;i++){
        int x,y;
        cin>>x>>y;
        if(x==y&&x>0&&y>0){
            sum+=3;
            f[i]=true;
            none=false;
        }
        else if(x==y&&x==0&&y==0){
            sum+=2;
        }
        else{
            sum+=1;
        }
    }
    cout<<"Points scored: "<<sum<<endl;
    if(none){
        cout<<"No scoring draws";
    }
    else{
        for(int i=1;i<=8;i++){
            if(f[i]){
                cout<<s[i]<<endl;
            }
        }
    }
    return 0;
}

把No scoring draws删了之后就100分了

AC代码:

#include<bits/stdc++.h>
using namespace std;
string s[9];
int sum=0;
bool f[9];
bool none=true;
int main(){
    memset(f,false,sizeof(f));
    getline(cin,s[1]);
    for(int i=2;i<=8;i++){
        getline(cin,s[i]);
    }
    for(int i=1;i<=8;i++){
        int x,y;
        cin>>x>>y;
        if(x==y&&x>0&&y>0){
            sum+=3;
            f[i]=true;
            none=false;
        }
        else if(x==y&&x==0&&y==0){
            sum+=2;
        }
        else{
            sum+=1;
        }
    }
    cout<<"Points scored: "<<sum<<endl;
    for(int i=1;i<=8;i++){
        if(f[i]){
            cout<<s[i]<<endl;
        }
    }
    return 0;
}

第五题也很简单,给你一串数字算出来它加上校验码应该是多少,这里建议用字符串操作,照题意模拟就行

AC代码:

#include<bits/stdc++.h>
using namespace std;
string s;
string add(string s){
    long long sum=0;
    int t=2;
    for(int i=s.size()-1;i>=0;i--){
        sum+=(int)(s[i]-'0')*t;
        t++;
        sum%=11;
    }
    sum%=11;
    sum=11-sum;
    sum%=11;
    if(sum==10){
        return "rejected";
    }
    string ans=s;
    ans+=(char)(sum+'0');
    return ans;
}
int main(){
    while(true){
        cin>>s;
        if(s=="0"){
            break;
        }
        else{
            cout<<s<<" -> "<<add(s)<<endl;
        }
    }
    return 0;
}

第六题还是很简单,给你一个表格让你找出其中的所有非16进制字符输出然后输出每一行的数值(例如A ! 2中!不是16进制字符,剩下A2的数值是162)

什么你说你不知道怎么算16进制,那你回语法班上几天吧

注意点:输出的非16进制符号之间没有空格(加了空格40分)

AC代码:

#include<bits/stdc++.h>
using namespace std;
int n;
char a[11][11];
bool f[11][11];
int trans(string s){
    int sum=0;
    for(int i=0;i<s.size();i++){
        sum*=16;
        if(s[i]>='0'&&s[i]<='9'){
            sum+=(int)(s[i]-'0');
        }
        else if(s[i]>='A'&&s[i]<='F'){
            sum+=(int)(s[i]-'A'+10);
        }
    }
    return sum;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>a[i][j];
            if(a[i][j]>='0'&&a[i][j]<='9'||a[i][j]>='A'&&a[i][j]<='F'){
                f[i][j]=true;
            }
            else{
                f[i][j]=false;
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(!f[i][j]){
                cout<<a[i][j];
            }
        }
    }
    cout<<endl;
    for(int i=1;i<=n;i++){
        string s="";
        for(int j=1;j<=n;j++){
            if(f[i][j]){
                s+=a[i][j];
            }
        }
        cout<<trans(s)<<endl;
    }
    return 0;
}

第七题对头和骑士的大小从小到大进行排序,这么做是为了防止一个身高有208200的骑士只去砍一个1直径的头,用t表示砍到了第几个头,如果一个骑士的身高大于第t个头就让这个骑士去(因为我们从小到大排序所以第一个身高大于第t个头直径的骑士一定是花费最小的)

AC代码:

#include<bits/stdc++.h>
using namespace std;
int a[20001],b[20001];
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    for(int i=1;i<=m;i++){
        scanf("%d",&b[i]);
    }
    sort(a+1,a+n+1);
    sort(b+1,b+m+1);
    int ans=0;
    int t=1;
    for(int i=1;i<=m;i++){
        if(b[i]>=a[t]){
            t++;
            ans+=b[i];
        }
        if(t>n){
            break;
        }
    }
    if(t<=n){
        cout<<"Loowater is doomed!";
    }
    else{
        cout<<ans;
    }
    return 0;
}

第八题我没做出来但是李凌宇AC了快@李凌宇出题解(bushi

评论

乙鸟
第二题需要注意,最后付款的商品和免费的商品总和是否和需要购买的商品总数一致

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。