1. 程式人生 > >牛客網—頭條校招

牛客網—頭條校招

題目描述

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

思路:直接暴力即可,資料不大,不會超時。把所有題目的難度存放到數組裡面,每次按從小到大的順序對陣列排序一次,然後從第一個開始迴圈,如果當前的難度減去前面一題的難度大於10並且前一題的題目序號不是3的倍數(即當前題和前一題為一組)就說明連線處斷開了 需要新增一個題  使這兩題能夠連線起來  為了確保能夠最大限度的保證可以連線起這兩個 新增的題目難度為v[i-1]+10   新增之後  記錄新增題目數的變數+1   並且跳出當前的for迴圈  不再繼續往後面去跑  跳出後進入最外面的while迴圈  對陣列進行重新排序  如果沒有滿足if條件的情況出現 那麼judge值就為true 即當前的陣列已經是最優情況了  那麼跳出while迴圈  最後判斷一下陣列的總長度是不是3的倍數  如果不是  則新增一定的題目使其變成3的倍數(因為3題一組 必須確保每組都是3題 即總題目數為3的倍數)

AC程式碼:

#include <iostream>
#include <algorithm>
#include <vector> 
#include <cstring>
using namespace std;

int main(void){
	int n,sum=0;
	cin>>n;
	vector<int> v(n,0);//建立大小為n  初值為0的動態陣列 
	for(int i=0;i<n;i++){
		cin>>v[i];
	}
	while(true){
		bool judge=true;
		sort(v.begin(),v.begin()+n);
		for(int i=1;i<v.size();i++){
			if(v[i]-v[i-1]>10&&i%3){//滿足條件  則在兩題之間新增一道題 
				judge=false;
				sum++;
				v.insert(v.begin()+i,v[i-1]+10);
				break;
			}
		}
		if(judge){//判斷當前陣列是不是最優情況 
			break;
		}
	}
	if(v.size()%3){//判斷最後的總題數是不是3的倍數  如果不是 則新增 
		sum=sum+3-(v.size()%3);
	}
	cout<<sum<<endl;
	return 0;
}