美团2021校招笔试-编程题(通用编程试题,第10场) 第二题


题目:

我们称一个长度为n的序列为正则序列,当且仅当该序列是一个由1~n组成的排列,即该序列由n个正整数组成,取值在[1,n]范围,且不存在重复的数,同时正则序列不要求排序

有一天小团得到了一个长度为n的任意序列,他需要在有限次操作内,将这个序列变成一个正则序列,每次操作他可以任选序列中的一个数字,并将该数字加一或者减一。

请问他最少用多少次操作可以把这个序列变成正则序列?


tips:

数组标记

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main() {
	int n;
	cin>>n;
	vector<int> ans(n,0);
	vector<int> ans1(10001,0);
	int t=0;
	for(int i=0; i<n; ++i) {
		cin>>ans[i];
		if(ans[i]>0&&ans[i]<n+1)
			ans1[ans[i]]++;
	}
	sort(ans.begin(),ans.end());
	for(int i=0; i<n; ++i) {
		if(ans[i]<1||ans[i]>n||ans1[ans[i]]>1)
			for(int j=1; j<n+1; ++j) {
				if(ans1[j]==0) {
					ans1[j]=1;
					t+=abs(ans[i]-j);
					if(ans[i]>0&&ans[i]<n+1&&ans1[ans[i]]>1) {
						ans1[ans[i]]--;
					}
					break;
				}

			}
	}
	cout<<t;
	return 0;
}

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:C马雯娟 返回首页