字节跳动ZJ25->头条校招
头条校招
http://www.nowcoder.com/questionTerminal/57cf0b1050834901933e9b48daafbb9a
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; } }