1. 程式人生 > >CCF計算機軟體能力認證模擬試題參考答案(JAVA)(201703 1+2)

CCF計算機軟體能力認證模擬試題參考答案(JAVA)(201703 1+2)

1.分蛋糕:

小明今天生日,他有n塊蛋糕要分給朋友們吃,這n塊蛋糕(編號為1到n)的重量分別為a1a2, …, an。小明想分給每個朋友至少重量為k的蛋糕。小明的朋友們已經排好隊準備領蛋糕,對於每個朋友,小明總是先將自己手中編號最小的蛋糕分給他,當這個朋友所分得蛋糕的重量不到k時,再繼續將剩下的蛋糕中編號最小的給他,直到小明的蛋糕分完或者這個朋友分到的蛋糕的總重量大於等於k
  請問當小明的蛋糕分完時,總共有多少個朋友分到了蛋糕。 輸入格式   輸入的第一行包含了兩個整數nk,意義如上所述。
  第二行包含n個正整數,依次表示a1a2, …, an。 輸出格式   輸出一個整數,表示有多少個朋友分到了蛋糕。 樣例輸入 6 9
2 6 5 6 3 5 樣例輸出 3

參考答案:

import java.util.Scanner;

public class Main{
	public static void main(String[] args){
		Scanner scanner=new Scanner(System.in);
		int n=scanner.nextInt();
		int k=scanner.nextInt();
		int[] cakes=new int[n];
		for(int i=0;i<n;i++){
			cakes[i]=scanner.nextInt();
		}
		int i=0;
		int number=0;
		while(i<n){
			for(int j=0;j<k&&i<n;){
				j+=cakes[i];
				i++;
			}
			number++;
		}
		System.out.print(""+number);
	}
	
}

***********************************************************************************************************************************************************************************************************

2.學生排隊:

問題描述   體育老師小明要將自己班上的學生按順序排隊。他首先讓學生按學號從小到大的順序排成一排,學號小的排在前面,然後進行多次調整。一次調整小明可能讓一位同學出隊,向前或者向後移動一段距離後再插入佇列。
  例如,下面給出了一組移動的例子,例子中學生的人數為8人。
  0)初始佇列中學生的學號依次為1, 2, 3, 4, 5, 6, 7, 8;
  1)第一次調整,命令為“3號同學向後移動2”,表示3號同學出隊,向後移動2名同學的距離,再插入到佇列中,新佇列中學生的學號依次為1, 2, 4, 5, 3, 6, 7, 8;
  2)第二次調整,命令為“8號同學向前移動3”,表示8號同學出隊,向前移動3名同學的距離,再插入到佇列中,新佇列中學生的學號依次為1, 2, 4, 5, 8, 3, 6, 7;
  3)第三次調整,命令為“3號同學向前移動2”,表示3號同學出隊,向前移動2名同學的距離,再插入到佇列中,新佇列中學生的學號依次為1, 2, 4, 3, 5, 8, 6, 7。
  小明記錄了所有調整的過程,請問,最終從前向後所有學生的學號依次是多少?
  請特別注意,上述移動過程中所涉及的號碼指的是學號,而不是在隊伍中的位置。在向後移動時,移動的距離不超過對應同學後面的人數,如果向後移動的距離正好等於對應同學後面的人數則該同學會移動到佇列的最後面。在向前移動時,移動的距離不超過對應同學前面的人數,如果向前移動的距離正好等於對應同學前面的人數則該同學會移動到佇列的最前面。 輸入格式   輸入的第一行包含一個整數n
,表示學生的數量,學生的學號由1到n編號。
  第二行包含一個整數m,表示調整的次數。
  接下來m行,每行兩個整數p, q,如果q為正,表示學號為p的同學向後移動q,如果q為負,表示學號為p的同學向前移動-q。 輸出格式   輸出一行,包含n個整數,相鄰兩個整數之間由一個空格分隔,表示最終從前向後所有學生的學號。 樣例輸入 8
3
3 2
8 -3
3 -2 樣例輸出 1 2 4 3 5 8 6 7

參考答案:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
	public static void main(String[] args){
		Scanner scanner=new Scanner(System.in);
		int n=scanner.nextInt();//學生數
		int m=scanner.nextInt();//調整次數
		int[] ids=new int[m];//調整的學號陣列
		int[] steps=new int[m];//調整 步伐陣列
		List<Integer> list=new ArrayList<>();//佇列陣列
		for(int i=0;i<n;i++){
			list.add(i+1);
		}
		
		for (int i = 0; i < m; i++) {
			ids[i]=scanner.nextInt();
			steps[i]=scanner.nextInt();
		}
		for(int i=0;i<m;i++){
			change(list,ids[i],steps[i]);
		}
		String result="";
		for (int i = 0; i < n; i++) {
			result+=list.get(i);
			if (i<n-1) {
				result+=" ";
			}
		}
		System.out.print(result);
	}

	private static void change(List<Integer> list, int id, int step) {
		for(int position=0;position<list.size();position++){
			if (list.get(position)==id) {
				list.remove(position);
				int newPosition=position+step;
				if (newPosition<0) {
					newPosition=0;
				} 
				if (newPosition<list.size()) {
					list.add(newPosition, id);
				} else {
					list.add(id);//放在隊尾
				}
				return;
			}
		}
	}
	
}