今日头条 添加最小题目数

题目:

头条的2017校招开始了!为了这次校招,我们组织了一个规模宏大的出题团队,每个出题人都出了一些有趣的题目,而我们现在想把这些题目组合成若干场考试出来,在选题之前,我们对题目进行了盲审,并定出了每道题的难度系统。一场考试包含3道开放性题目,假设他们的难度从小到大分别为a,b,c,我们希望这3道题能满足下列条件:
a<=b<=c
b-a<=10
c-b<=10
所有出题人一共出了n道开放性题目。现在我们想把这n道题分布到若干场考试中(1场或多场,每道题都必须使用且只能用一次),然而由于上述条件的限制,可能有一些考试没法凑够3道题,因此出题人就需要多出一些适当难度的题目来让每场考试都达到要求,然而我们出题已经出得很累了,你能计算出我们最少还需要再出几道题吗? 

思路:

对题目难度进行排序,从最大值开始选择,如果次大值小于最大值10以上,就必须加一道题目,当前最大值可以看出是 最大值-10,这样能包含更多的题目。设置flag标志,表示当前考场题目数,如果题目满足三个,本考场不需要添加题目,继续向下数。最后循环遍历一遍后可以的到需要加的题目数,最后要加上剩下flag中没满足的数目,也就是最后一个考场需要添加的题目3-flag。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
    int n;
    cin>>n;
    int a = n;
    vector<int> re;
    while(a--) {
        int b;
        cin>>b;
        re.push_back(b);
    }
    sort(re.begin(),re.end());
    int flag = 1, cur = re[n-1], count = 0;
    for(int i = n-2; i >= 0; i--) {
        if(flag == 3) {
            cur = re[i];
            flag = 1;
        } else {
            if(cur-re[i]<=10) {
                flag++;
                cur = re[i];
            } else {
                flag ++;
                count++;
                cur = cur- 10;
                i++;
            }
        }
    }
    cout<<count+3-flag;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值