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