头条校招

头条校招

题目描述:

题目描述

头条的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个难度分别为2050的题目,这样可以组合成两场考试:(20 20 23)和(35,40,50)。

输出描述:

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

示例1

输入

4  
20 35 23 40

输出

2

思路:

先找三个的,再找两个的,最后输出只有单独一个的*2+两个的

代码:

package main
import "fmt"
import "sort"
func main(){
    var n,a,sum1,sum2  int
    fmt.Scan(&n)
    num := make([]int,n)
    flag := make([]int,n)
    for i:=0;i<n;i++{
        fmt.Scan(&a)
        num[i] = a
    }
    sort.Ints(num)
    for i:=2;i<n;i++{
        //找到三个数的
        if flag[i-2]==0&&flag[i-1]==0&&flag[i]==0{
            if num[i]-num[i-1]<=10&&num[i-1]-num[i-2]<=10{
                flag[i],flag[i-1],flag[i-2] = 1,1,1
                sum1++
            }
        }
    }
    //找到两个数的
    for i:=1;i<n;i++{
        if flag[i-1]==0&&flag[i]==0{
            if num[i]-num[i-1]<=10{
                flag[i],flag[i-1] = 1,1
                sum2++
            }
        }
    }
    fmt.Println(sum2+2*(n-3*sum1-2*sum2))
    
}

代码效率:

执行用时:0 ms, 在所有 Go 提交中击败了100.00%的用户
内存消耗:2.2 MB, 在所有 Go 提交中击败了100.00%的用户


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!