Logo 快乐的熊果的博客

博客

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是正确的

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

求大佬帮助

快乐的熊果 Avatar