您的位置:首页 > 其它

牛客网NowCoder-2018年全国多校算法寒假训练营练习比赛(第一场) A-大吉大利,今晚吃鸡——枪械篇 F-大吉大利,今晚吃鸡——跑毒篇 H-方块与收纳盒 I-找数字个数

2018-01-22 11:29 1676 查看
这场打的超级烂,代码写的错误很智障,A题忘记写负号,F想的少了一个1,I写的也很智障,输入忘记加&,程序直接跑崩了。。。

A-大吉大利,今晚吃鸡——枪械篇

链接:https://www.nowcoder.com/acm/contest/67/A
来源:牛客网

时间限制:C/C++1秒,其他语言2秒

空间限制:C/C++32768K,其他语言65536K

64bitIOFormat:%lld

题目描述

在绝地求生(吃鸡)游戏里,不同的枪支有不同的威力,更是可以搭配不同的配件,以提升枪支的性能。



每一把枪都有其威力及其可装备配件种类。每一个配件有其所属种类,可以为枪支提供威力的百分比加成。每一把枪只能装备一个同类配件。给你n把枪支和m个配件,枪的威力为p,可装备的配件数量为k,为k个不同类型的配件,同种类配件只可以装备一个。配件种类用数字q表示,配件威力加成用一个小数b表示。请你挑选一把枪并为其搭配配件使其威力最大。

假设一把枪的威力是p,装配的k个配件的威力加成是bi,那么枪最后的威力w=p*(1+b1+b2+…+bk)。

输入描述:

数据有多组,处理到文件结束。
第一行两个整数n和m,代表枪支数量和配件数量。
接下来n行,描述n把枪的属性:第一个整数为p,代表枪支的威力;第二个整数为k,代表该枪支可装备的配件数量;后面k个整数,代表可装备配件的种类。
接下来m行,描述m个配件的属性:第一个整数为q,代表配件的种类,第二个浮点数为b,代表配件可以为枪支提供的威力加成。

输出描述:

每组数据输出为一行,输出一个浮点数,代表合理装备配件后的枪支最大威力。精确到小数点后4位。


示例1

输入

36
1203123
10041234
1103234
10.12
20.23
20.26
40.57
30.35
50.41


输出

239.8000


说明

对于上面的样例,正确答案应该是,使用第三把枪,配上第三、四、五个配件。
枪的最终威力就是110*(1+0.26+0.57+0.35)=239.8


备注:

对于100%的数据,
1<=n,m,k,q<=1000;
0<=p<=1000;
0<=b<=1。

代码:


1#include<iostream>
2#include<cstring>
3#include<cstdio>
4#include<cmath>
5#include<algorithm>
6usingnamespacestd;
7structnode{
8ints[1000];
9intx;
10intnum;
11doubleans;
12}a[1000];
13structnode1{
14intp;
15doubleq;
16}b[1000];
17boolcmp(nodea,nodeb){
18returna.ans>b.ans;
19}
20intmain(){
21intn,m;
22while(~scanf("%d%d",&n,&m)){
23for(inti=0;i<n;i++){
24scanf("%d%d",&a[i].x,&a[i].num);
25for(intj=0;j<a[i].num;j++)
26scanf("%d",&a[i].s[j]);
27}
28for(inti=0;i<m;i++)
29scanf("%d%lf",&b[i].p,&b[i].q);
30for(inti=0;i<n;i++){
31doubleret=0;
32for(intk=0;k<a[i].num;k++){
33doublemaxx=-0x3f3f3f3f;
34for(intj=0;j<m;j++){
35if(a[i].s[k]==b[j].p){
36if(maxx<b[j].q)maxx=b[j].q;
37}
38}
39if(maxx!=-0x3f3f3f3f)ret+=maxx;
40}
41a[i].ans=a[i].x*(1+ret);
42}
43sort(a,a+n,cmp);
44printf("%.4f\n",a[0].ans);
45}
46return0;
47}


F-大吉大利,今晚吃鸡——跑毒篇

链接:https://www.nowcoder.com/acm/contest/67/F
来源:牛客网

时间限制:C/C++1秒,其他语言2秒

空间限制:C/C++32768K,其他语言65536K

64bitIOFormat:%lld

题目描述



现在有一款很火的游戏playerunknown'sbattlegrounds,人称“吃鸡”,在里面经常面临跑毒(从安全区外跑进安全区内)的问题,在安全区外,人们会处于中毒状态,每秒会掉a%血,人们可以通过使用道具急救包把血量升回到80%,使用急救包需要原地站着6秒。现在知道在安全区外扣血速度为a%/s,角色和安全区的距离为b米,角色跑步速度为1m/s,角色有c个急救包,请问角色是否能安全跑进安全区内。(PS:角色开始的血量为100%。如果血量降到0%,立刻判定为死亡。使用急救包时,如果刚使用完毕瞬间或者正在使用急救包的时候,血量降到0%,角色立即判定为死亡。顺带一提,这里判断时间不存在0.xxxx秒,最小时间单位为1s)

输入描述:

第一行是样例数T(T<9)
第2到2+T-1行每行有三个整数abc,其中a为安全区外的扣血速度a%/s,b为角色和安全区的距离,c为急救包的数量。

输出描述:

如果角色能进入安全区输出“YES”。
若角色在安全区外死亡输出“NO”。


示例1

输入

3
11002
6312
7312


输出

YES
YES
NO


说明

当a=6,b=31,c=2时,
0s起跑,10s的时候角色跑了10M,血量剩下40%,开始使用急救包,16s的时候,角色血量先降到4%再恢复到80%,然后角色继续跑步。23s的时候,角色跑了17M,剩余血量为38%,开始使用急救包,
29s的时候,角色血量先降到2%再恢复到80%,然后角色继续跑步。42s的时候,角色跑了30m,血量剩余2%。当43s的时候,角色跑了31m进入了安全区内,不再扣血。


备注:

对于100%的数据,
1<=T<9;
0<a<=20;
0<b<=120;
0<=c<=8。


这个题写的我很难过,因为当最后还剩一点血,而且不足掉血的速度的时候,还能再跑一米。。。这里被卡了一手,而且我一开始写的代码要考虑的比较麻烦。
后面看了队友的,队友写的就是比我的好,没办法,谁让我是基地最菜(;´д`)ゞ

代码:


1#include<iostream>
2#include<cstring>
3#include<cstdio>
4#include<cmath>
5#include<algorithm>
6usingnamespacestd;
7intmain(){
8intt,a,b,c;
9scanf("%d",&t);
10while(t--){
11scanf("%d%d%d",&a,&b,&c);
12intp=0,bl=100;
13while(bl){
14if(bl%a==0){
15if(c==0){
16p+=bl/a;
17bl=0;
18}
19else{
20if(c!=0){
21p+=bl/a-7;
22bl=80;
23c--;
24}
25}
26}
27else{
28if(c==0){
29p+=bl/a+1;
30bl=0;
31}
32else{
33if(c!=0){
34p+=bl/a-6;
35bl=80;
36c--;
37}
38}
39}
40}
41if(p>=b)printf("YES\n");
42elseprintf("NO\n");
43}
44return0;
45}




H-方块与收纳盒

链接:https://www.nowcoder.com/acm/contest/67/H
来源:牛客网

时间限制:C/C++1秒,其他语言2秒

空间限制:C/C++32768K,其他语言65536K

64bitIOFormat:%lld

题目描述



现在有一个大小n*1的收纳盒,我们手里有无数个大小为1*1和2*1的小方块,我们需要用这些方块填满收纳盒,请问我们有多少种不同的方法填满这个收纳盒

输入描述:

第一行是样例数T
第2到2+T-1行每行有一个整数n(n<=80),描述每个样例中的n。

输出描述:

对于每个样例输出对应的方法数


示例1

输入

3
1
2
4


输出

1
2
5


说明

n=4,有五种方法
1:1111
2:211
3:121
4:112
5:22


备注:

对于100%的数据,
0<T<80;
0<n<=80。

这个题是递推,没什么想说的。。。
代码:


1#include<iostream>
2#include<cstring>
3#include<cstdio>
4#include<algorithm>
5usingnamespacestd;
6typedeflonglongll;
7lla[100];
8intmain(){
9intn,m;
10scanf("%d",&n);
11while(n--){
12scanf("%d",&m);
13memset(a,0,sizeof(a));
14a[0]=0,a[1]=1,a[2]=2;
15for(inti=3;i<=m;i++){
16a[i]=a[i-1]+a[i-2];
17}
18printf("%lld\n",a[m]);
19}
20return0;
21}


I-找数字个数

链接:https://www.nowcoder.com/acm/contest/67/I
来源:牛客网、

时间限制:C/C++1秒,其他语言2秒

空间限制:C/C++32768K,其他语言65536K

64bitIOFormat:%lld



题目描述

lulu喜欢小于等于1000的正整数,但是如果某个数是a或b的倍数,lulu会讨厌这个数。如果某个数里包含了a和b两个数里包含的数,lulu也会讨厌。(例如a=14,b=23,如果数字中包含1、2、3、4这四个数中的任意一个数,lulu就会讨厌这个数)。现在告诉你a,b,你能说出lulu喜欢的数有多少个么。

输入描述:

第一行是样例数T
第2到2+T-1行每行有2个整数ab。

输出描述:

输出lulu喜欢的数的个数


示例1

输入

3
23
1423
12345678


输出

171
190
7


说明

a=1234b=5678的时候,只考虑含有数字9,0的数,只有7个,分别是9,99,999,90,990,909,900


备注:

对于100%的数据,
0<T<=20;
0<=a<=99999;
0<=b<=99999。

这个题一点也不好玩,也可能是我太挫了,写的不好玩。。。
这个题没看好题意,倍数也不可以,眼瞎,没看到。。。

代码:


1#include<iostream>
2#include<cstring>
3#include<cstdio>
4#include<algorithm>
5usingnamespacestd;
6inta[1000],b[1000];
7intflag1[100],flag2[100];
8intmain(){
9intt,x,y;
10scanf("%d",&t);
11while(t--){
12memset(a,0,sizeof(a));
13memset(b,0,sizeof(b));
14memset(flag1,0,sizeof(flag1));
15memset(flag2,0,sizeof(flag2));
16scanf("%d%d",&x,&y);
17intlen1=0,len2=0;
18intx1=x,y1=y;
19while(x){
20a[len1++]=x%10;
21x/=10;
22}
23while(y){
24b[len2++]=y%10;
25y/=10;
26}
27for(inti=0;i<len1;i++)
28flag1[a[i]]=1;
29for(inti=0;i<len2;i++)
30flag2[b[i]]=1;
31ints[1000];
32intx,ans=0;
33for(inti=1;i<=1000;i++){
34intcnt=i,h=0;x=0;
35intret=i;
36while(cnt){
37s[h++]=cnt%10;
38cnt/=10;
39}
40intflag=0;
41for(intj=0;j<h;j++){
42if(flag1[s[j]]==1){flag=1;break;}
43}
44if(flag!=1){
45for(intj=0;j<h;j++)
46if(flag2[s[j]]==1){flag=1;break;}
47}
48if(ret%x1!=0&&ret%y1!=0&&flag==0)ans++;
49}
50printf("%d\n",ans);
51}
52return0;
53}




一点也不好玩,溜了溜了。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐