C题
题意:现在给你n个数,让你找出1~n的一个排列,使得此排列与这n个数对应下标相等的每一个数的值都不相同,如果找到了就输出YES,并打印这个排列,找不到就输出NO
思路:1~n按顺序分别与这n个数比较,如果相同就和前一个数交换位置,最后特判一下最后一位是否相等,如果相等的话,就从前n-1个数中找到第一个和它不相等的,交换位置即可
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <map>
#include <vector>
using namespace std;
const int N = 1e5 + 10;
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
map<int, int> m;
int n;
scanf("%d", &n);
vector<int> a(n + 1), b(n + 1);
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
m[a[i]]++;
b[i] = i;
}
if (m[a[1]] == n)
{
printf("NO\n");
}
else
{
printf("YES\n");
for (int i = 1; i <= n - 1; i++)
{
if (a[i] == b[i])
{
swap(b[i], b[i + 1]);
}
}
if (b[n] == a[n])
{
for (int i = 1; i <= n; i++)
{
if (a[i] != b[n])
{
swap(b[i], b[n]);
break;
}
}
}
for (int i = 1; i <= n; i++)
{
printf("%d ", b[i]);
}
printf("\n");
}
}
return 0;
}
F题
https://ac.nowcoder.com/acm/contest/33192/F
思路:用deque容器储存值,如果输入的数与容器最后的值相互匹配,就pop_back(),否则就插入这个数,最后判断剩下的数第一个和最后一个是否相互匹配,如果相等就剔除第一个和最后一个数,继续前面的操作,否则就退出,输出最后的值即可
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, x;
scanf("%d%d", &n, &x);
int ans;
int sum = 0;
deque<int> v;
for (int i = 1; i <= n; i++)
{
scanf("%d", &ans);
if (v.empty())
{
v.push_back(ans);
}
else
{
if (v.back() == ans || v.back() + ans == x)
{
v.pop_back();
sum++;
}
else
{
v.push_back(ans);
}
}
}
while (v.size() >= 2)
{
if (v.front() == v.back() || v.front() + v.back() == x)
{
sum++;
v.pop_back();
v.pop_front();
}
else
{
break;
}
}
printf("%d\n", sum);
return 0;
}
H题
把题意看懂即可
略