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;
}