[編程題] 頭條校招

頭條的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

輸出例子1:
2

#include <bits/stdc++.h>
using namespace std;  

void myCount(vector<int> &a,int n)  
{   
    int count = 0;  
    vector<int> result;
    sort(a.begin(),a.end());  
    result.push_back(a[0]);   
    for(int i=1;i<a.size();i++)  
    {  
        if(a[i]-a[i-1]<=10)  
        {  
            result.push_back(a[i]);  
            if(result.size()==3)  
            {  
                result.clear();  
                i++;  
                if(i>=a.size())  
                    break;  
                result.push_back(a[i]);  
            }  
        }  
        else  
        {  
            count = count + 3 - result.size();  
            result.clear();  
            result.push_back(a[i]);  
        }  
    }  
    if(result.size()!=0)  
        count = count + 3 -result.size();  
    cout<<count<<endl;  
}    
int main()  
{  
    int n;  
    cin>>n;  
    vector<int> a;  
    for(int i=0;i<n;i++)  
    {  
        int r;  
        cin>>r;  
        a.push_back(r);  
    }  
    myCount(a,n);  
    return 0;  
}  
發佈了163 篇原創文章 · 獲贊 21 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章