2023牛客寒假算法基础集训营6

文章包含一系列编程题目,涉及难度分级如veryeasy到cannotimagine。示例题目包括签到题的难度输出、整数倍数计算、大背包问题的解法探讨以及二进制操作和整数配对问题。此外,还讨论了计算虚空蛇被攻击概率的数学问题。
摘要由CSDN通过智能技术生成

A-阿宁的签到题

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

这是一道签到题,想必大家都可以顺利签到吧?!!!

在这次寒假集训营中每一个题都有一个难度评分xxx。

题目分为以下等级:

  • very easy (​1≤x≤7)(​1\le x \le 7)(​1≤x≤7)
  • easy (7<x≤233)(7\lt x \le 233)(7<x≤233)
  • medium (233<x≤10032)(233\lt x \le 10032)(233<x≤10032)
  • hard (10032<x≤114514)(10032\lt x \le 114514)(10032<x≤114514)
  • very hard (​114514<x≤1919810)(​114514\lt x \le 1919810)(​114514<x≤1919810)
  • can not imagine (​1919810<x)(​1919810\lt x)(​1919810<x)

你拿到这次寒假集训营其中的一道题,并且对它评估了一个分数,请你根据以上划分输出等级。

输入描述:

输入一个整数xxx。
1≤x<2311 \le x \lt 2^{31}1≤x<231

输出描述:

输出一个字符串。

示例1

输入

复制1

1

输出

复制very easy

very easy

说明

 

想必这题就是这个等级吧(゜▽゜*)。

示例2

输入

复制2147483647

2147483647
#include<bits/stdc++.h>
using namespace std;
int main(){
    long long int x;
    cin>>x;
    if(x>=1&&x<=7)cout<<"very easy";
    else if(x>7&&x<=233)cout<<"easy";
    else if(x>233&&x<=10032)cout<<"medium";
    else if(x>10032&&x<=114514)cout<<"hard";
    else if(x>114514&&x<=1919810)cout<<"very hard";
    else cout<<"can not imagine";
    return 0;
}

B-阿宁的倍数 

 //以下是错误代码,本人觉得题目蛮简单的,测试样例也过了,但是问题是超时,实在想不出有什么高效办法,有待解决。

#include<bits/stdc++.h>
using namespace std;
int main(){
  long long int n,q,a[400005],i,j,op,x,y=0;
    cin>>n>>q;
    j=n;
    for(i=1;i<=n;i++)cin>>a[i];
    while(q--){
         y=0;
        cin>>op>>x;
        if(op==1)a[++j]=x;
        else{
            for(i=x+1;i<=j;i++){
                if(a[i]%a[x]==0)y++;
            }
            cout<<y<<endl;
        }
    }
    return 0;
}

C-阿宁的大背包 

 //代码只写了一般,准确来说只有开头,题目读懂了,但解题规律一直没找到,就是对1-n排个序,使得不断重复每两两相加得到一个最大值。

这种排序有很多种,按我的理解是,可以看成金字塔,顶端是最大,依次下边是第二第三大,可以发现第一次操作后有一些数字对称,这样也方便后面进行输出,比如1357642,也就是左小右大,且左边奇数右边偶数,当然偶数个情况下,比如1342,虽然和输出样例不同,但结果是相同的,也就是3,4可以调换。

我一直以为有规律,就是利用公式即可解决最大值,然后处理顺序,后面补题参考了人家的代码,才发现自己对循环的利用不到家阿。

将奇数依次存数组,借助k变量,同时利用k变量,依次获取末尾位置存入偶数,再用个数组把当前数组序存好,然后借助双重循环,第一是循环次数,第二是每次i循环下产生的n-i个结果,结束之后就取余,避免后面太大。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,i,a[1005],j,k=0,b[1005];
    cin>>n;
    for(i=1;i<=n;i++){
        if(i%2==1)a[++k]=i;
        else a[n-k+1]=i;
    }
    for(i=1;i<=n;i++)b[i]=a[i];
    for(i=1;i<=n;i++){
        for(j=1;j<=n-i;j++){
            a[j]=a[j]+a[j+1];
            a[j]%=1000000007;
        }
    }
    cout<<a[j]<<endl;
    for(i=1;i<=n;i++){
        if(i!=1)cout<<" ";
        cout<<b[i];
    }
    return 0;
}

F- 阿宁的二进制

//题目是读懂了,但是实现的这个过程好难,代码未进行尝试 

G-阿宁的整数配对

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

阿宁有一个长度为nnn的整数数组aaa,阿宁想要在其中选出恰好kkk对整数,使得每对整数相乘并求和尽可能大。

阿宁想知道最终得到的值是多少?

输入描述:

第一行两个整数n,kn,kn,k。
第二行nnn个整数aia_iai​。
2≤n≤2×1052 \le n \le 2 \times 10^52≤n≤2×105
1≤k≤⌊n2⌋1 \le k \le \lfloor \frac{n}{2} \rfloor1≤k≤⌊2n​⌋
−100≤ai≤100-100  \le a_i \le 100−100≤ai​≤100

输出描述:

 

输出一个整数,表示答案。

示例1

输入

复制5 2 1 2 -1 -2 -3

5 2
1 2 -1 -2 -3

输出

复制8

8

说明

选择111和222,−2-2−2和−3-3−3,1×2+(−2)×(−3)=81\times 2 + (-2)\times(-3)=81×2+(−2)×(−3)=8。

示例2

输入

复制5 2 -1 0 0 0 0

5 2
-1 0 0 0 0

输出

复制0

0

说明

选择−1-1−1和000,000和000,−1×0+0×0=0-1\times 0 + 0\times 0=0−1×0+0×0=0。

//就是把正负数分别存入a,b数组,然后分别排序,再分别一对一对的相乘存c数组,如果有单着的数就不管,但是当n是偶数,并且证书和负数都为奇数个时候,再作一次特殊计算,这里的正数包括了0,最后c数组排序,加上最大k对就行了.

#include<bits/stdc++.h>
using namespace std;
 int main(){
      int n,k,i,a[200005],b[200005],c[200005],s=0,d,x=0,y=0,z=0;
     map<int,int>p; 
     cin>>n>>k;
     for(i=0;i<n;i++){
         cin>>d;
         if(d<0)a[x++]=d;
         else b[y++]=d;
     }
     sort(a,a+x);
     sort(b,b+y);
     for(i=0;i<x;i++){
         if(p[i]==0&&p[i+1]==0&&i+1<x){c[z++]=a[i]*a[i+1];p[i]=1;p[i+1]=1;}
     }
     p.clear();
     for(i=y-1;i>=0;i--){
         if(p[i]==0&&p[i-1]==0&&i-1>=0){c[z++]=b[i]*b[i-1];p[i]=1;p[i-1]=1;}
     }
     p.clear();
     if(n%2==0&&x%2==1&&y%2==1)c[z++]=a[x-1]*b[0];
     sort(c,c+z);
     for(i=z-1;i>=0;i--){
         if(k==0)break;
         s+=c[i];k--;
     }cout<<s;
     return 0;
 }

H- 阿宁讨伐虚空

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

脆皮领主阿宁带领着脆皮小弟们前往虚空,讨伐虚空领主。
虚空领主有一个小弟虚空蛇,由于虚空蛇敏捷高速、攻击范围广,脆皮小弟们一死一大片,阿宁大为痛心。

- 您的114514个脆皮变成了脆皮干。
- 您的114514个脆皮护甲不足,没了。
- 您的114514个脆皮挂了,真弱。
- 您的114514个脆皮皮爆了。
- 您的114514个脆皮摔死了。
- 您的114514个脆皮翘辫子了。
- 您的114514个脆皮心电图成了直线。
- 您的114514个脆皮熔化了。
- 您的114514个脆皮渡过了冥河。
- 您的114514个脆皮食尘了。
- 您的114514个脆皮无法继续与您并肩作战了。
- 您的114514个脆皮消失了。

在一次对拼中,阿宁有xxx个脆皮攻击虚空蛇。虚空蛇在脆皮攻击之前杀死yyy个脆皮(yyy是区间[L,R][L,R][L,R]内等概率选一个整数。如果x<yx\lt yx<y,那么只杀死xxx个脆皮)。如果脆皮还活着,就能攻击到虚空蛇。
问:在一次对拼中,虚空蛇被攻击到的概率是多少?

输入描述:

第一行一个整数xxx。
第二行两个整数L,RL,RL,R。
1≤x≤1091\le x \le 10^91≤x≤109
1≤L≤R≤1091\le L \le R \le 10^91≤L≤R≤109

输出描述:

输出一个浮点数,表示虚空蛇被攻击到的概率。
如果你的答案和标准答案的相对误差小于10−610^{-6}10−6,则认为你的答案正确。

示例1

输入

复制5 1 6

5
1 6

输出

复制0.6666666666666666

0.6666666666666666

说明

 

yyy取111到444时,还有脆皮没死,虚空蛇会被攻击到。

yyy取555到666时,脆皮都死了,虚空蛇不会被攻击到。

示例2

输入

复制114514 1314 1919810

114514
1314 1919810

输出

复制0.0590045228

0.0590045228

//不要被输出格式误导

#include<bits/stdc++.h>
using namespace std;
 int main(){
     int x,l,r,s=0;
     cin>>x;
     cin>>l>>r;
     for(int i=l;i<=r;i++){
         if(i<x)s++;
     }
     printf("%lf",s*1.0/(r-l+1));
     return 0;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星河欲转。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值