1. 程式人生 > >2018美團點評內推筆試程式設計題2

2018美團點評內推筆試程式設計題2

老師不想自己改試卷,於是讓大家互相改試卷。

把全班同學分為k組,每組有s(k)個同學,

老師先選擇一個組i,將這個組的所有試卷s(i)份都收上來放在講臺上

然後再選擇一個組j,從講臺上拿s(j)份試卷隨機分給j組的同學,然後把j組的所有試卷收上來,放在講臺上試卷的最下方

……重複上述過程,

最後把剩餘的試卷隨機分給i組的s(i)個同學。

但是這樣分配試卷是有缺陷的,比如:

1.有可能出現講臺上試卷不夠的的情況

2.可能出現有的同學改到自己試卷的情況

題目給出k個組每個組同學的數量,請問是否可以找到一種策略使得不會出現缺陷

如果可以找到,輸出"Yes"

否則輸出"No"

對於這個題,我們先分析一下,

1.首先,老師選擇的第一個組必須是數量最大的組;

假如我們選的第一組不是數量最大的組,對於接下來的每一個組,我們的操作都是先把講臺上的試卷減少s(i)份,然後再增加s(i)份,講臺上的試卷數量穩定是第一組的數量,當我們碰到數量比第一組大的組時,會出現缺少試卷的缺陷,所以老師選擇的第一個組必須是數量最大的組;

2.第一組的數量必須小於等於剩下各組的和

如果第一組的數量大於剩下各組的和,那麼把第一組的試卷分給剩下的每個組中的同學後,還有剩餘,剩餘的試卷再分給第一組,就會出現自己改自己試卷的情況,出現缺陷。

3.只要第一組是數量最大的組,那麼剩下各組分試卷的順序是無所謂的

因為我們選擇的第一組是數量最大的組,所以講臺上試卷數量始終都會大於等於各組的數量,必然不會出現缺少試卷的情況

綜上:這個題的焦點就在於最大數量的組是否小於等於剩下各組的和

import java.util.*;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            int n = in.nextInt();
            in.nextLine();
            int max = 0;
            int sum = 0;
            int a = 0;
            for(int i=0;i<n;i++){
            	a  = in.nextInt();
            	sum += a;
            	if(a>max)
            		max = a;	
            }
            
            if(sum >= 2*max)
            	System.out.println("Yes");
            else
            	System.out.println("No");
        }
	}
}

題目是非常簡單的,關鍵在於理解題意,我剛開始看到題目也有點蒙,仔細想一想,理清思路就OK。