2018美團點評內推筆試程式設計題2
阿新 • • 發佈:2019-02-10
老師不想自己改試卷,於是讓大家互相改試卷。
把全班同學分為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。