CF1283 C. Friends and Gifts(思维)
题目大意:
忽略背景故事。。。其实就是一个数列,每个位置上的数不能为自己的位置。
思路:
首先记录出没有被选中的数,从后往前遍历,并且进行变化,但是这样变化之后,不一定是对的,如果我们遍历发现有错的话,那我们就从前遍历。
#include<iostream>
#include<stack>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
const int p = 1e9 + 7;
typedef pair<int, int> pii;
const int N = 1e6+10;
map<ll, int>mp;
ll num[N];
ll a[N];
ll c[N];
bool st[N];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
st[a[i]] = true;
c[i] = a[i];
}
int k = 0;
for (int i = 1; i <= n; i++) {
if (!st[i])num[k++] = i;
}
int l = 0, r = k-1;
for (int i = 1; i <= n; i++) {
if (a[i] != 0) {
continue;
}
else {
if (num[r] != i) {
a[i] = num[r];
r--;
}
else {
a[i] = num[l];
l++;
}
}
}
int flag = 0;
for (int i = 1; i <= n; i++) {
if (a[i] == i) {
flag = 1;
break;
}
}
if (!flag) {
for (int i = 1; i <= n; i++)cout << a[i] << ' ';
}
else {
l = 0, r = k - 1;
for (int i = 1; i <= n; i++) {
if (c[i] != 0) {
continue;
}
else {
if (num[l] != i) {
c[i] = num[l];
l++;
}
else {
c[i] = num[r];
r--;
}
}
}
for (int i = 1; i <= n; i++)cout << c[i] << ' ';
}
}