1. 分析点

  1. 先说通过样例里的代码num%3的写法,哈哈。邪教做法,但能过样例,比赛的时候可以碰碰运气,这道题真的是出题人仁慈的签到题,后台测试数据很仁慈。但正儿八经用贪心的写法还是得会的。
  2. 自己对这道题贪心的结构没理清清楚,看了卷积神经网络哦的思路,看得出来卷积神经网络哦对这道题很用心,写了点注释并做了一点修改,本人对初始化有强迫症emmmm。
  3. 关于数组大小le5+3是一种常用写法就是10的5次方。

2.源代码

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 3;

int main(){
    int n=0, a[maxn]={0};
       cin>>n;
    for(int i = 0; i < n; i++) 
        cin>>a[i];
      sort(a, a + n);
    if(n == 1) 
        cout<<"2"<<endl;  
    else if(n == 2) {
        if(a[1]-a[0] > 20) 
            cout<<"4"<<endl; 
        else 
            cout<<"1"<<endl;
    }
    else{
        int l = 0, add = 0;
        while(l < n - 2){ //while循环好
            //不用增加
            if(a[l+1]-a[l] <= 10 && a[l+2] - a[l+1] <= 10) 
                l += 3;
            //不满足的话 如果 后面比前面的已经大了20 说明中间插入也解决不了
            //直接加2 l向后走
            else if(a[l+1] - a[l] > 20) 
            {
                add += 2; l += 1;//过当前1位置
            }
            //若不满足小于20的则说明中间插入有机会  10<<20 则中间插入
            else if(a[l+1]-a[l] <= 20 && a[l+1]-a[l] > 10) 
            {
                add++;l+=2;//过当前1,3位置3其实就是1后的临界
            }
            //不用中间插而是插第三个的  
            else if(a[l+1]-a[l] <= 10 && a[l+2]-a[l+1] > 10)
            {
                add++;l+=2;//过当前1.2位置 2也就是1的原临接
            }
            //情况全判断完后
            if(l == n - 1) //i有+=1和+=2,==n-1说明是最后一个 还要两个凑
                add += 2;
            if(l == n - 2) {//是最后两个 还要一个凑
                if(a[l+1]-a[l] > 20) add += 4;
                else add += 1;
            } 
        }
        cout<<add<<endl;
    } 
}