【程式設計測試題】頭條校招

HelloZEX發表於2018-08-15

題目描述

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

輸出描述:

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

#include<iostream>
#include<vector>
#include <algorithm>
using namespace std;
 
int main()
{
	int n;
	//int *a = new int[n];
	vector<int> a;
	int i, j;
	int out=0;
	cin >> n;
	int aa;
	for(i=0; i<n; ++i)
	{
		cin >> aa;
		a.push_back(aa);
	}
	sort(a.begin(), a.end());
	int num;
	for(i=0; i<n; ++i)//從前往後遍歷
	{
		num=1;
		if(i<n-2)
		{
			if(a[i+1]-a[i] <= 10)
			{
				num++;
				if(a[i+2]-a[i+1] <= 10)
				{
					num++;
					i+=2;
				}
				else
				{
					num++;
					out++;
					i++;
				}
			}
			else if(a[i+1]-a[i] <= 20)
			{
				num+=2;
				out++;
				i++;
			}
			else
			{
				num+=2;
				out+=2;	
			}
		}
		else if(i==n-2)//如果只剩下兩個元素
		{
			if(a[i+1]-a[i]<=20)
			{
				num+=2;
				out++;
				i++;
			}
			else
			{
				num+=2;
				out+=4;
				i++;
			}
		}
	}
	if(num!=3)//如果只剩下一個元素
		out += (3-num);
	cout << out << endl;
 
}

貪婪演算法,排序後有符合條件的就計數,不符合的再看加幾個符合。

相關文章