Logo 快乐的熊果的博客

博客

找到朱梓鸭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

这是谁?

快乐的熊果 Avatar