赛码网

  1. 题目描述

头条的2017校招开始了!为了这次校招,我们组织了一个规模宏大的出题团队。每个出题人都出了一些有趣的题目,而我们现在想把这些题目组合成若干场考试出来。在选题之前,我们对题目进行了盲审,并定出了每道题的难度系数。一场考试包含3道开放性题目,假设他们的难度从小到大分别为a, b, c,我们希望这3道题能满足下列条件:

a<= b<= c
b - a<= 10
c - b<= 10

所有出题人一共出了n道开放性题目。现在我们想把这n道题分布到若干场考试中(1场或多场,每道题都必须使用且只能用一次),然而由于上述条件的限制,可能有一些考试没法凑够3道题,因此出题人就需要多出一些适当难度的题目来让每场考试都达到要求。然而我们出题已经出得很累了,你能计算出我们最少还需要再出几道题吗?

这道题关键在于序列排好序后三个一组,也就是当前面m个元素的数目是3倍时,即使下一个元素和dm-1的差大于10也不要紧。那么思路应该是遍历序列,当之前元素比上一元素大10而且在子序列中,就要手动补上元素,并不能更新索引。


 int main() {
	 int N;
	 cin >> N;

	 vector<int> num(N, 0);
	 for (int i = 0; i < N; ++i) {
		 cin >> num[i];
	 }

	 sort(num.begin(), num.end());
	 int res = 0, last = num[0], count = 1, i = 1;
	 while (i < N)
	 {
		 if (num[i] - last <= 10)
		 {
			 last = num[i];
			 i++;
		 }
		 else
		 {
			 if (count == 3)
			 {
				 last = num[i];
				 i++;
			 }
			 else
			 {
				 res++;
				 last += 10;
			 }
		 }
		 count++;
		 if (count > 3) count = 1;
	 }
	 N += res;
	 if (N % 3) res += (3 - N % 3);
	 cout << res << endl;
	 return 0;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值