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

找到朱梓鸭2

2025-04-13 10:35:03 By 快乐的熊果

12月算法比赛题解(不全)

2024-12-23 22:06:21 By 快乐的熊果

前言:没写完,只写了前面几个水题……

A题:很简单,输入+算各位和+排序+输出,全员AC

代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int a[n+1];
    int t;
    int sum;
    for(int i=1;i<=n;i++){
        cin>>t;
        sum=0;
        while(t>0){
            sum+=t%10;
            t/=10;
        }
        a[i]=sum;
    }
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++){
        cout<<a[i]<<' ';
    }
    return 0;
}

B题:因为只有一副对联不全,所以排序之后查找。如果一副对联是全的,那么它应该与他后面的尺寸相等(i=i+1),如果不一致就是缺(好像有点难懂)

代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int a[n+1];
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i+=2){
        if(a[i]!=a[i+1]){
            cout<<a[i];
            return 0;
        }
    }
    return 0;
}

C题,有难度,但是不多。对结束时间进行排序,如果一个节目的开始时间晚于或等于上一个观看节目的结束时间(a[x].si>=a[i].ei),就可以看(似乎也有点难懂)

代码:

#include <bits/stdc++.h>
using namespace std;
struct node{
    int si,ei;
}a[208201];
bool cmp(node x,node y){
    return x.ei<y.ei;
}
bool vis[208201];
int sum=1;
int m;
bool pd(int x){
    for(int i=x-1;i>=1;i--){
        if(vis[i]){
            if(a[x].si>=a[i].ei){
                return true;
            }
            else{
                return false;
            }
        }
    }
}
int main(){
    cin>>m;
    for(int i=1;i<=m;i++){
        cin>>a[i].si>>a[i].ei;
    }
    sort(a+1,a+m+1,cmp);
    vis[1]=true;
    for(int i=2;i<=m;i++){
        if(pd(i)){
            sum++;
            vis[i]=true;
        }
    }
    cout<<sum;
    return 0;
}

E题:这道题有难度,正解应该用二分答案(当然你用歪门邪道也是可以过去的),这里只讲二分。

先说思路:从1~1e9(1000000000)之间二分,如果这个时间可以使每个集装箱风干,我们就移动右指针(r=mid-1)看看时间能否更短,反之就移动左指针(l=mid+1)

那么如何判断时间是否够呢?要分三种情况

1.可以自然风干:不必管他

2.用吸尘器清理Xs后正好可以清除:time+=(box[i]-midXa)/b;(X是乘号)

3.用吸尘器清理Xs后还需要再清一次:time+=(box[i]-midXa)/b+1;

然后把所花费的时间加起来然后判断就可以了

还有一点很重要:开LONG LONG(不开会0分)

代码:

#include<bits/stdc++.h>
using namespace std;
long long n,a,b;
int box[10000001];
bool check(long long mid){
    long long time=0;
    for(int i=1;i<=n;i++){
        if(box[i]<=mid*a){
            continue;
        }
        else{
            if((box[i]-mid*a)%b==0){
                time+=(box[i]-mid*a)/b;
            }
            else{
                time+=(box[i]-mid*a)/b+1;
            }
        }
    }
    return time<=mid;
}
int main(){
    cin>>n>>a>>b;
    for(int i=1;i<=n;i++){
        cin>>box[i];
    }
    long long l=1,r=1e9,mid,ans;
    while(l<=r){
        mid=(l+r)/2;
        if(check(mid)){
            ans=mid;
            r=mid-1;
        }
        else{
            l=mid+1;
        }
    }
    cout<<ans;
    return 0;
}

G题:一道数论题,让我们看看怎么推出来的

step 1:a^2-b^2=(a+b)(a-b)=>a+b与a-b奇偶性相同

step 2:所以(a+b)(a-b)要么是奇数,要么是4的倍数

step 3:couple number要么是奇数,要么是4的倍数

代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n1,n2,sum=0;
    cin>>n1>>n2;
    for(int i=n1;i<=n2;i++){
        if(i%4==0||i%2!=0){
            sum++;
        }
    }
    cout<<sum;
    return 0;
}

关于4897的一点点问题

2024-08-17 19:45:55 By 快乐的熊果

让我们先看一组样例:

158 539 658 83 813 122 461 589 324 363 45 329 765 457 135 501 732 121 826 467 300 416 189 730 114 54...

wrong answer 1st words differ - expected: '83', found: '158'

很明显错误是因为第一个数字应该是83而不是158,但是这题没有说按什么顺序来输出(而且我的输出后面也有83),题意就是问你哪些宝石留下,所以我觉得输出顺序不一样也没问题。

当然可能我朵拉了没看见输出要求,如果是这样我马上把这篇博客删了。

希望有大佬回答我个蒟蒻的问题

你们进省赛了吗?

2024-05-15 19:40:45 By 快乐的熊果

今年分数线是34分,你们进了吗?

反正我是擦边进的

?

2024-05-09 20:51:43 By 快乐的熊果

81 不快乐的穷果 1500

这是谁?

关于13093的一些疑问

2024-05-02 11:19:22 By 快乐的熊果

题目描述:

草帽海贼团的路飞船长驾着万里阳光号,环游大半个地球,历经艰险,终于找到了前任海贼王罗杰的宝藏盒。可惜宝盒异常坚固,怎么都打不开,上面只有四个每隔一分钟变 化一次的整数,还有一个用来输入密码的锁。路飞尝试了很多密码,但都不对。不过一天夜里,卡吕普索女神托梦给他,告诉他:盒子的密码是不断变化的,如果设某一时间 盒子上的四个整数,从左到右分别为l,h,a,b,则此时盒子的密码为满足以下三个条件的最小的整数 x:

l <= x 且 x <= h

a mod x = 0

x mod b = 0

有一组数据是这样的:84 111 102 2

我的程序输出是102,但正确答案是-1(没有就是-1)

但是102大于84也小于111,102取余102与102取余2也都等于0所以我认为102是正确的

当然可能本人题没读透但是我真的没看出来哪有问题

求大佬帮助

《论如何快速崩网站》

2024-03-10 10:09:27 By 快乐的熊果

一直刷新就可以崩网站了!!!

原理猜测:快速刷新会给服务器多个请求,服务器处理不过来就爆炸了

找到朱梓鸭1

2024-01-24 11:10:38 By 快乐的熊果

《论helloworld的题库数据如此之水这件事》

2024-01-21 16:35:39 By 快乐的熊果

题目:7458,链接:http://go.helloworldroom.com/problem/7458

题目描述:

从n个排好序的数中查找有无x。

数据范围:n(n≤100000) n个从小到大排列的整数ai(ai<2e9) 整数m,表示询问的次数(m≤10000) m个整数

输出m行,对于每一个询问,如果有这个数,则输出"Yes",否则输出"No"

从数据范围中我们可以看出来,这是一个二分。

But!

我的代码

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int a[n+1],tong[500001];
    for(int i=1;i<=n;i++){
        cin>>a[i];
        tong[a[i]]=1;
    }
    int m;
    cin>>m; 
    int t;
    for(int i=1;i<=m;i++){
        cin>>t;
        if(tong[t]==1){
            cout<<"Yes"<<endl;
        }
        else{
            cout<<"No"<<endl;
        }
    }
    return 0;
}

桶排序都可以做!你的2e9数据范围哪去了?

共 27 篇博客