橙白oj 2017级《算法分析与设计》-练习02

举报
兔老大 发表于 2021/05/07 04:57:38 2021/05/07
【摘要】 注:A题我以为给新生出的,应该贼简单,是按顺序消灭,卡了十几分钟,成了最后一个ac的题,真是菜的真实。   Problem A: Description 白细胞是人体与疾病斗争的“卫士”。当病菌侵入人体体内时,白细胞能通过变形而穿过毛细血管壁,集中到病菌入侵部位,将病菌包围﹑吞噬。如果体内的白细胞的数量高于正常值,很可能是身体有了炎症。   ...

注:A题我以为给新生出的,应该贼简单,是按顺序消灭,卡了十几分钟,成了最后一个ac的题,真是菜的真实。

 

Problem A:

Description

白细胞是人体与疾病斗争的“卫士”。当病菌侵入人体体内时,白细胞能通过变形而穿过毛细血管壁,集中到病菌入侵部位,将病菌包围﹑吞噬。如果体内的白细胞的数量高于正常值,很可能是身体有了炎症。

 

现在,白细胞遇到了一群杂菌,它有n(0<n<1000)点体力,现在有m个杂菌,每个杂菌需要ai点体力去消灭(0<ai<1000)。请问,白细胞最多能消灭多少个杂菌呢?

Input

第一行有两个数n和m,分别代表白细胞的体力和杂菌数量 第二行有m个数,a0,a1,...a(m-1),分别代表消灭其需要的体力。

Output

最大能消灭多少个杂菌。

Sample Input


  
  1. 6 3
  2. 1 2 3

Sample Output

3
 

解析:模拟消灭杂菌的过程:排序,先消灭较小的数字。


  
  1. import java.util.Scanner;
  2. import java.util.Arrays;
  3. public class Main {
  4. public static void main(String[] args) {
  5. Scanner sc = new Scanner(System.in);
  6. int n=sc.nextInt();
  7. int m=sc.nextInt();
  8. int[] arr=new int[m];
  9. for(int i=0;i<m;i++)arr[i]=sc.nextInt();
  10. Arrays.sort(arr);
  11. int ak=0;
  12. while(ak<m && n>=arr[ak]) {
  13. n-=arr[ak];
  14. ak++;
  15. }
  16. System.out.println(ak);
  17. }
  18. }

 

Problem B:

Description

红细胞也称红血球,在常规化验英文常缩写成RBC,是血液中数量最多的一种血细胞,同时也是脊椎动物体内通过血液运送氧气的最主要的媒介,同时还具有免疫功能。哺乳动物成熟的红细胞是无核的,这意味着它们失去了DNA。红细胞也没有线粒体,它们通过分解葡萄糖释放能量。运输氧气,也运输一部分二氧化碳。运输二氧化碳时呈暗紫色,运输氧气时呈鲜红色

红细胞会生成于骨髓之内,开始在白细胞内生长。红细胞老化后,易导致血管堵塞,所以会自动返回骨髓深处,由白细胞负责销毁;或是在经过肝脏时,被枯否细胞分解成为胆汁。

32767号红细胞正在把氧气运送到目的地,她面前是一层层的血管网,到达目的地之前一共有很多层血管网,对于每一层血管网,红细胞都可以有很多条路径通过,从而到达层与层之间的节点,最终到达终点。

32767号红细胞是个路痴,请帮她计算出一共有多少条路径。

Input

第一行输入一个整数n(0<n<20)代表血管层数。

第二行输入n个整数ai,代表每层一共有多少条路径。(0<ai<1000)。

Output

一个整数,代表路径的总数

且保证答案在long long范围之内(py选手不用管)

Sample Input

5 10 20 30 40 50

Sample Output

12000000

 

解析:经过分析,数字相乘即可。


  
  1. import java.util.Scanner;
  2. public class Main {
  3. public static void main(String[] args) {
  4. Scanner sc = new Scanner(System.in);
  5. int n=sc.nextInt();
  6. long ak=1;
  7. for(int i=0;i<n;i++)ak*=sc.nextInt();
  8. System.out.println(ak);
  9. }
  10. }

Problem C:

Description

细胞毒性T细胞(cytotoxic T cell,Tc或CTL),也称杀伤性T细胞。是一种监控并在需要时杀死靶细胞的细胞。记忆细胞毒性T细胞对带抗原的靶细胞有记忆功能,由细胞毒性T细胞分化而成。一旦发现带特异性抗原的靶细胞,会刺激效应细胞毒性T细胞产生效应细胞毒性T细胞,消灭被感染的细胞或癌细胞。

癌细胞出现了!杀手T细胞出动!

杀手T细胞需要迅速到达癌细胞的位置,他离癌细胞有n米的距离,它每次可以选择走1米或者跑2米,问,杀手T细胞有多少种方式到达癌细胞的位置。

例如:杀手T细胞离癌细胞3米,他可以每次都走1米,或者第一次走1米,第二次跑2米,也可以第一次跑2米,第二次走1米,一共三种方式到达癌细胞的位置。

Input

输入包含若干行,每行包含一个正整数n(1<=n<=30),n代表杀手T细胞离癌细胞的位置。

Output

一个正整数,代表杀手T细胞到达癌细胞的方法数目。

Sample Input


  
  1. 5
  2. 8
  3. 10

Sample Output


  
  1. 8
  2. 34
  3. 89

解析:

杀手T细胞离癌细胞1米,有一种方法。

杀手T细胞离癌细胞2米,可以分两次或者一次,有两种方法。

之后,因为第n米只可能是通过n-1或n-2跳来的,所以到达第n米的方法数等于ak[n]=ak[n-1]+ak[n-2],按顺序求出答案即可。


  
  1. import java.util.Scanner;
  2. public class Main {
  3. public static void main(String[] args) {
  4. Scanner sc = new Scanner(System.in);
  5. long[] ak=new long[35];
  6. while(sc.hasNextInt()) {
  7. int n=sc.nextInt();
  8. ak[1]=1;
  9. ak[2]=2;
  10. for(int i=3;i<=n;i++)ak[i]=ak[i-1]+ak[i-2];
  11. System.out.println(ak[n]);
  12. }
  13. }
  14. }

Problem D: 水仙花数

Description

请判断一个数是不是水仙花数。
其中水仙花数定义各个位数立方和等于它本身的三位数。

Input

有多组测试数据,每组测试数据以包含一个整数n(100<=n<1000) 输入0表示程序输入结束。

Output

如果n是水仙花数就输出Yes 否则输出No

Sample Input

153
154
0


Sample Output


  
  1. Yes
  2. No

解析:求出各个位数的立方和,和本身作比较即可(小号交的循环求,怕查重,手打三个位数)


  
  1. import java.util.Scanner;
  2. public class Main {
  3. public static void main(String[] args) {
  4. Scanner sc = new Scanner(System.in);
  5. while(true) {
  6. int n=sc.nextInt();
  7. if(n==0)break;
  8. int a=n/100;
  9. int b=(n/10)%10;
  10. int c=n%10;
  11. if(a*a*a+
  12. b*b*b+
  13. c*c*c==n) {
  14. System.out.println("Yes");
  15. }else {
  16. System.out.println("No");
  17. }
  18. }
  19. }
  20. }

Problem E: 合并

Description

现在给你两堆数,每个堆中有n个数。你的任务是把这两个堆并成一个堆,并把合并后的堆中的元素按从小到大的顺序输出。例如当n=5时,第一个堆是{1,2,3,4,5},第二个堆是{5,6,7,8,9},那么你就应该输出1 2 3 4 5 6 7 8 9。(一堆中可能有重复的数)

Input

第一行输入一个整数T(1≤T≤100),表示有T组测试数据。 每组数据先输入一个整数N(1≤N≤10),表示每个堆中元素的个数。然后输入N个整数A(0≤A<100),最后输入N个整数B(0≤B<100)。

Output

把合并后的堆中的元素按从小到大的顺序输出。

Sample Input


  
  1. 2
  2. 5
  3. 1 2 3 4 5
  4. 5 6 7 8 9
  5. 6
  6. 18 88 43 5 10 78
  7. 94 99 37 92 3 52

Sample Output


  
  1. 1 2 3 4 5 6 7 8 9
  2. 3 5 10 18 37 43 52 78 88 92 94 99

解析:合并两组数并且去重按顺序输出,由题意得,数字均小于100,范围较小,考虑采用桶思想,数组记录对应下标的数字出没出现过即可。

另:注意输出格式,找出第一个数字,不打印空格。

之后的数字,前面打印空格。


  
  1. import java.util.Arrays;
  2. import java.util.Scanner;
  3. public class main {
  4. public static void main(String[] args) {
  5. Scanner sc = new Scanner(System.in);
  6. int n=sc.nextInt();
  7. while(n-->0) {
  8. int[] ak=new int[100];
  9. int m=sc.nextInt();
  10. for(int i=0;i<2*m;i++)ak[sc.nextInt()]=1;
  11. int i;
  12. for(i=0;i<100;i++) {
  13. if(ak[i]==1) {
  14. System.out.print(i);
  15. break;
  16. }
  17. }
  18. for(i++;i<100;i++)
  19. if(ak[i]==1)
  20. System.out.print(" "+i);
  21. System.out.println();
  22. }
  23. }
  24. }

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/100579252

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。