【演算法】今日頭條2017程式設計題
阿新 • • 發佈:2019-01-01
解法一:
思路:
第一步先 排序。這個大家都能想到。
第二步,三個為一組。首先看前三個 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;
}