1. 程式人生 > >【2017今日頭條】頭條校招(JAVA)

【2017今日頭條】頭條校招(JAVA)

題目描述

頭條的2017校招開始了!為了這次校招,我們組織了一個規模巨集大的出題團隊,每個出題人都出了一些有趣的題目,而我們現在想把這些題目組合成若干場考試出來,在選題之前,我們對題目進行了盲審,並定出了每道題的難度系統。一場考試包含3道開放性題目,假設他們的難度從小到大分別為a,b,c,我們希望這3道題能滿足下列條件:
a<=b<=c
b-a<=10
c-b<=10
所有出題人一共出了n道開放性題目。現在我們想把這n道題分佈到若干場考試中(1場或多場,每道題都必須使用且只能用一次),然而由於上述條件的限制,可能有一些考試沒法湊夠3道題,因此出題人就需要多出一些適當難度的題目來讓每場考試都達到要求,然而我們出題已經出得很累了,你能計算出我們最少還需要再出幾道題嗎?

輸入描述:

輸入的第一行包含一個整數n,表示目前已經出好的題目數量。

第二行給出每道題目的難度係數d1,d2,...,dn。 

資料範圍

對於30%的資料,1 ≤ n,di ≤ 5;

對於100%的資料,1 ≤ n ≤ 10^5,1 ≤ di ≤ 100。

在樣例中,一種可行的方案是新增2個難度分別為20和50的題目,這樣可以組合成兩場考試:(20 20 23)和(35,40,50)。

輸出描述:

輸出只包括一行,即所求的答案。
示例1

輸入

4  
20 35 23 40

輸出

2

答案描述

1.將難易程度排序,從小到大,從第二個數字開始遍歷。

2.定義一個標誌t,表示當前數字的前一個數字為三個數字中的第幾個。

3.比較當前數字和前一個數字的之間的間隔。

4.如果間隔小於10,則t++,跳過,不做處理。如果t大於等於3,則說明已經湊成了完整的一組,需要將t賦值為1.

5.如果間隔小於20,並且前一個數為第一個數,則說明只需要在中間插入一個數即可湊成一組。此時,count++,t = 3;

6.如果前一個數的標記值t == 1; 並且間隔大於20,則說明需要在錢一個數後面加上兩個數才能將前一個數湊成一個組。

7.如果錢一個數的標記值t == 2; 並且間隔大於10, 則說明需要在錢一個數後面加上一個數才能將前兩個數湊成一個組。

8.最後一個數在迴圈中可能沒有處理,所以需要在迴圈外重新新增。

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();

        int[] d = new int[n];

        Arrays.sort(d);
        int t = 1;
        int count = 0;
        for (int i = 1; i < n; i++){
            if (t < 3){
                if (d[i] - d[ i - 1] <= 10){
                    t++;
                }else if (t ==  1 && d[i] - d[i - 1] <=20){
                    count++;
                    t = 3;
                }else {
                    count+= 3 - t;
                    t = 1;
                }
            }else {
                t = 1;
            }
        }
        count += 3 - t;
        System.out.println(count);
    }
}