算法|科大訊飛2019暑期實習筆試題


一、改成績

題目:

  華老師的n個學生參加了一次模擬測驗,考出來的分數很糟糕,但是華老師可以將成績修改為[0,100]中的任意值,所以他想知道,如果要使所有人的成績的平均分不少於X分,至少要改動多少個人的分數?

輸出和輸出說明:

輸入

第一行一個數T,共T組數據(T≤10)

接下來對於每組數據:

第一行兩個整數n和X。(1≤n≤1000, 0≤X≤100)

第二行n個整數,第i個數Ai表示第i個學生的成績。(0≤Ai≤100)

輸出

共T行,每行一個整數,代表最少的人數。

輸入和輸出示例:

  樣例輸入:

2
5 60
59 20 30 90 100
5 60
59 20 10 10 100


  樣例輸出:

1 2

解題思路:

  要想改動最少的人來達到新的平均分,就要找出原來分數的最低分,將其改為100,之后進行判定。

代碼實現:

package stuSys;
import java.util.Scanner;
public class Main {

    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        for (int i = 0;i<T ;i++ ) {
            int n = sc.nextInt();
            int x = sc.nextInt();
            int[] scores = new int[n];
            for (int j =0;j<n ;j++ ) {
                scores[j] = sc.nextInt();
            }
        int answer = updataNum(scores,n,x);
        System.out.println(answer);

        }
    }
    
    //修改成績的次數
    private static int updataNum(int[] scores,int n, int x){
        int count = 0;
        while(tempAvgScores(scores,n)<x){
            count++;
            int index = findMinScores(scores);
            scores[index] = 100;
        }
        return count;
    }

    //返回平均分
    private static int tempAvgScores(int[] scores,int n){
        int sumResult = 0;
        for (int i=0;i<n ;i++ ) {
            sumResult  +=scores[i];
        }
        return sumResult/n;
    }

    //找出數組中最小數字的下標
    private static int findMinScores(int[] scores){
        int index = 0;
        for(int i=0;i<scores.length;i++){
            if(scores[index]>scores[i])
                index = i;
        }
        return index;
    }
    
}

二、殺手

題目:

  有n個殺手排成一行,每個殺手都有一個不同的編號(編號為1-n),在每個夜晚,殺手都會行動,如果某個殺手編號大於他右邊的殺手的編號,他就會殺死他右邊的殺手,殺手的行動是瞬間的,因此一個人可能某一個演完既殺死了別人,又被別人殺死了,例如3,2,1這個順序,在第一個夜晚2會殺死1,同時3會殺死2.顯然易見,一段時間之后,就不會有人殺死或者被殺了,平安夜也就來了,請問在平安夜之前有多少個夜晚?

輸入輸出說明:

  輸入 

第一行是一個整數n(1<=n<=100000),表示殺手的數量。 接下來一行有n個數,是一個1-n的全排列。

  輸出

輸出包含一個整數,表示平安夜之前經歷個多少了夜晚。

 

示例:

樣例輸入
10
10 9 7 8 6 5 3 4 2 1
樣例輸出
2

解題思路:

從題意中可以理解到,如果要殺手停止殺人,需要滿足以下條件之一:

  1、只剩下一個人;

  2、殺手的序號排列為降序排列;

只有滿足這兩個條件之一的時候,殺手的序號才不會發生變化,即不會再有人殺或被殺,可以根據這個條件進行判斷,如果不滿足,就比較前后數的大小,進行相應的remove操作,如果滿足,就停止。

代碼實現:

import java.util.Scanner;
import java.util.Arraylist;
import java.util.List;
public class Main{
  public static void main(String[] args){
                Scanner sc = new Scanner(System.in);
                int n = sc.nextInt();
                List<Integer> listKiller = new ArrayList<Integer>();
                for (int i=0;i<n ;i++) {
                  listKiller.add(sc.nextInt());
                }
                int nightCount = 0;
                int rowSize = listKiller.size();
                while(listKiller.size()>1) {
                    for (int i = listKiller.size()-1; i >= 1; i--) {
                        if (listKiller.get(i)<listKiller.get(i-1)) {
                            listKiller.remove(i);
                        }
                    }
          //判斷listKiller大小是否發生變化
                    if(listKiller.size()==rowSize)
                        break;
                    else {
                        rowSize = listKiller.size();
                        nightCount++;
                    }
              }
             System.out.println(nightCount);  
  }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM