注: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
6 3
1 2 3
Sample Output
3
解析:模擬消滅雜菌的過程:排序,先消滅較小的數字。
import java.util.Scanner;
import java.util.Arrays;
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n=sc.nextInt();int m=sc.nextInt();int[] arr=new int[m];for(int i=0;i<m;i++)arr[i]=sc.nextInt();Arrays.sort(arr);int ak=0;while(ak<m && n>=arr[ak]) {n-=arr[ak];ak++;}System.out.println(ak);}
}
?
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
解析:經過分析,數字相乘即可。
import java.util.Scanner;
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n=sc.nextInt();long ak=1;for(int i=0;i<n;i++)ak*=sc.nextInt();System.out.println(ak);}
}
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
5
8
10
Sample Output
8
34
89
解析:
殺手T細胞離癌細胞1米,有一種方法。
殺手T細胞離癌細胞2米,可以分兩次或者一次,有兩種方法。
之后,因為第n米只可能是通過n-1或n-2跳來的,所以到達第n米的方法數等于ak[n]=ak[n-1]+ak[n-2],按順序求出答案即可。
import java.util.Scanner;
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);long[] ak=new long[35];while(sc.hasNextInt()) {int n=sc.nextInt();ak[1]=1;ak[2]=2;for(int i=3;i<=n;i++)ak[i]=ak[i-1]+ak[i-2];System.out.println(ak[n]);}}
}
Problem D: 水仙花數
Description
請判斷一個數是不是水仙花數。
其中水仙花數定義各個位數立方和等于它本身的三位數。
Input
有多組測試數據,每組測試數據以包含一個整數n(100<=n<1000) 輸入0表示程序輸入結束。
Output
如果n是水仙花數就輸出Yes 否則輸出No
Sample Input
153
154
0
Sample Output
Yes
No
解析:求出各個位數的立方和,和本身作比較即可(小號交的循環求,怕查重,手打三個位數)
import java.util.Scanner;
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while(true) {int n=sc.nextInt();if(n==0)break;int a=n/100;int b=(n/10)%10;int c=n%10;if(a*a*a+b*b*b+c*c*c==n) {System.out.println("Yes");}else {System.out.println("No");}}}
}
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
2
5
1 2 3 4 5
5 6 7 8 9
6
18 88 43 5 10 78
94 99 37 92 3 52
Sample Output
1 2 3 4 5 6 7 8 9
3 5 10 18 37 43 52 78 88 92 94 99
解析:合并兩組數并且去重按順序輸出,由題意得,數字均小于100,范圍較小,考慮采用桶思想,數組記錄對應下標的數字出沒出現過即可。
另:注意輸出格式,找出第一個數字,不打印空格。
之后的數字,前面打印空格。
import java.util.Arrays;
import java.util.Scanner;
public class main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n=sc.nextInt();while(n-->0) {int[] ak=new int[100];int m=sc.nextInt();for(int i=0;i<2*m;i++)ak[sc.nextInt()]=1;int i;for(i=0;i<100;i++) {if(ak[i]==1) {System.out.print(i);break;}}for(i++;i<100;i++)if(ak[i]==1)System.out.print(" "+i);System.out.println();}}
}
?