【算法】今日头条2017编程题

这里写图片描述
解法一:
思路:
第一步先 排序。这个大家都能想到。
第二步,三个为一组。首先看前三个 a1,a2,a3.
FIRST 如果a2-a1<=10&&a3-a2<=10 则符合要求,就从第4个开始,a4,a5,a6为一组。。。
SECOND 如果 a2-a1>10 && a2-a1<=20 则 数量+1,跳到第3个,a3,a,4,a5为一组。。。
THIRD 如果 a2-a1>20 则数量 +2;跳到第2 个,a2,a3,a4,为下一组。。
FOURTH 如果 a2-a1<=10,a3-a2>10,则数量+1,跳到第3个,a3,a4,a5为下一组。。。。

 #include<iostream>
 #include<vector>
 #include<algorithm>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
vector<int> ivec;
for(int i=0;i!=n;++i)
{
int temp;
cin>>temp;
ivec.push_back(temp);
}
sort(ivec.begin(),ivec.end());
int sz=ivec.size();
int count=0;
int zou;
for(zou=0;zou+2<sz;)
{
if(zou+2<sz)
{
if(ivec[zou+1]-ivec[zou]>10&&ivec[zou+1]-ivec[zou]<=20)
{count+=1;
zou+=2;
continue;
}
if(ivec[zou+1]-ivec[zou]>20)
{
count+=2;
++zou;
continue;
}
if(ivec[zou+1]-ivec[zou]<=10&&ivec[zou+2]-ivec[zou+1]>10)
{
++count;
zou+=2;
continue;
}
zou+=3;
}
}
if(sz-zou==2)
{
if(ivec[zou+1]-ivec[zou]<=10)
{
count+=1;
cout<<count<<endl;
break;

}
if(ivec[zou+1]-ivec[zou]>10&&ivec[zou+1]-ivec[zou]<=20)
{
count+=1;
cout<<count<<endl;
break;
}
if(ivec[zou+1]-ivec[zou]>20)
{
count+=4;
cout<<count<<endl;
break;
}
}
if(sz-zou==1)
{
count+=2;
}
cout<<count<<endl;
}

}

解法二:
思路:
有110个桶,把数放在桶里,然后如果两个有数的桶相差大于10,就插入一个数。
current记录每一套卷子中已经有的题,有三套题后,current要清零
answer记录总共需要补的题

#include <cassert>
#include <cstdio>
const int N = 110;
int elements[N], n;
int main() {
  assert(scanf("%d", &n) == 1);
  assert(1 <= n && n <= 1e5);
  for (int i = 1; i <= n; ++ i) {
    int x;
    assert(scanf("%d", &x) == 1);
    assert(1 <= x && x <= 100);
    elements[x] ++;
  }

  int answer = 0;
  int pivot = 1;
  int last = 0, current = 0;
  while (pivot < N) {
    while (pivot < N && elements[pivot] == 0) {
      pivot ++;
    }
    if (pivot >= N) break;
    if (current == 0) {
      last = pivot;
      current ++;
      elements[pivot] --;
      continue;
    }
    if (pivot <= last + 10) {
      last = pivot;
      elements[pivot] --;
      current ++;
      if (current == 3) {
        current = last = 0;
      }
    } else {
      answer ++;
      elements[last + 10] ++;
      pivot = last + 10;
    }
  }
  if (current) {
    answer += 3 - current;
  }
  printf("%d\n", answer);
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值