1. 程式人生 > >演算法小題(六):EatingDays

演算法小題(六):EatingDays

18年愛奇藝秋招題目:局長與食物

原題目

菊長有有N種食物,每種食物有Ai 份。

每天局長會吃一份食物,或買一份食物(即每天只進行一項行為),

就醬過了M 天,現在局長想知道M 天后第p種食物的份數排名(從大到小,相同算並列)

/**  * 1.局長有N種食物,每種食物Ai份,i代表食物號碼1~N  * 2.局長每天吃一份食物,或買一份食物(進食或買食)  * 3.過了M天,求第p種食物的剩餘份數排名情況  *   * input:     第1行 N M P   *               第2行 N個Ai[A1,A2...AN]  *               接下來M行  [A i|B i] [買一份 食物i | 吃一份 食物i]   *   * output:  一個結果   * @author Leonardo  */

樣例 input:3 4 2

                    5 3 1

                    B 1

                    A  2

                    A  2

                    B  3

        output:1

程式碼如下:

package IQIYI;

import java.util.Scanner;

public class EatingDays {
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		String str = sc.nextLine();
		int n = Integer.parseInt(str.split(" ")[0]);
		int m = Integer.parseInt(str.split(" ")[1]);
		int p = Integer.parseInt(str.split(" ")[2]);
		
		// 每種食物的份數
		String str2 = sc.nextLine();
		int[] food = new int[n];
		for (int i = 0; i < food.length; i++) {
			food[i] = Integer.parseInt(str2.split(" ")[i]);
		}
		
		// 模擬M天的動作
		String[] strM = new String[m];
		for (int i = 0; i < strM.length; i++) {
			strM[i] = sc.nextLine();
			String action = strM[i].split(" ")[0];
			int num = Integer.parseInt(strM[i].split(" ")[1]);
			if(action.equals("A")){
				food[num]++;
			}else{
				food[num]--;
			}
		}
		
		// 求排名
		int numOfFood = food[p-1];
		int x = 1;					// 最高排名為1
		for(int i=0; i<food.length; i++){
			if(numOfFood < food[i]){
				x++;
			}
		}
		System.out.println(x);
	}
	
}