用mulitiset<int>mark数据集来装载所有数据,好处是不会去重并自动排序,因为当两个相近的数据差值大于10的时候,很显然这个时候必然要插入新的数据,除非在mark[i+1]-mark[i]>10之前的数据是三的倍数,比如第9题的分数为10,第十题的为22,虽然两题相差12,但因为9可以被3整除,所以可以免除插入。
然而这个状况换成第7题是10,第8题为22,就不一样了,因为不是三的倍数,那么就要插入数据了,怎么插入数据才能使得所需数据最少呢,自然就是插入一个极限值10,这样第八题变成20,第9题变成22,都串联起来了
所以当我们从头开始检测的时候
这是两个临近指针,位数差1
multiset<
int
>::iterator itor = mark.begin();
++itor;
multiset<
int
>::iterator iter = mark.begin();
记录每次遍历过的数据个数
int
cnt = 1;
这就是是否在两个 相邻数据中插入数据的条件
*itor - *iter > 10 && (cnt % 3)
当满足上述条件之后,要插入一个数据,并记录此时的数据个数
temp=*itor+10;//意味在第一个数基础上增加最大极限值10;
然后把这个值插入当前数据集,并把插入的这个数据下表拿出来赋值给iter
mark.insert(temp);
cnt++;
iter=mark.find(temp);
如果不满足也就是说要么插入之后,数据间隔小于10---*itor-(*iter+10)<10;或者是插入之后,个数是三的倍数
最后由于可能存在这样一种状况,当itor是最后一个,iter还是相差>10,但是肯定无法满足最后分组都是3的倍数,所以最后我们还需要一种处理
mark.size()%3
if(mark.size()%3)//最后还不是3的倍数
ans=3-(mark.size()%3)
res=mark.size()-n+ans
#include <string>
#include <vector>
#include <algorithm>
#include <set>
int main()
{
using namespace std;
int n;
while (cin >> n)
{
multiset<int> mark;
for (int i = 0; i < n; i++)
{
int input;
cin >> input;
mark.insert(input);
}
multiset<int>::iterator itor = mark.begin();
++itor;
multiset<int>::iterator iter = mark.begin();
int cnt = 1;
for (; itor != mark.end(); itor++)
{
cnt++;
while (*itor - *iter > 10 && (cnt % 3))
{
int temp = *iter + 10;
mark.insert(temp);
iter = mark.find(temp);
}
iter++;
}
int ret = 0;
if (mark.size() % 3)
{
ret += 3 - (mark.size() % 3);
}
int ans = mark.size() - n + ret;
cout << ans << endl;
}
return 0;
}