题目来源:Problem - D - Codeforceshttps://codeforces.com/contest/1833/problem/D
这套题给的n范围是(1≤n≤2000) ,所以我们可以考虑暴力枚举找出最优值。
本文主要介绍题目中会用到的两个函数:
1.rotate
rotate()
函数用于旋转容器中的元素。
template <class ForwardIterator>
void rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last);
该函数接受三个迭代器参数:
first
:表示要旋转的范围的起始位置的迭代器。middle
:表示旋转范围的中间位置的迭代器。旋转后,middle
位置的元素将成为旋转范围的新起始位置。last
:表示旋转范围的结束位置的迭代器。旋转后,first
位置的元素将成为旋转范围的新结束位置的前一个元素。
rotate()
函数将范围 [first, last)
中的元素进行旋转,将范围 [first, middle)
的元素移到范围 [middle, last)
的后面。
#include <algorithm>
#include <vector>
int main() {
std::vector<int> nums = {1, 2, 3, 4, 5};
// 旋转范围 [nums.begin(), nums.begin() + 2) 的元素
std::rotate(nums.begin(), nums.begin() + 2, nums.end());
// 输出旋转后的结果:{3, 4, 5, 1, 2}
for (const auto& num : nums) {
std::cout << num << " ";
}
return 0;
}
上述示例中,rotate()
函数将范围 [nums.begin(), nums.begin() + 2)
的元素进行旋转,使得数字 1 和 2 移动到了容器的末尾,得到了新的元素顺序 {3, 4, 5, 1, 2}
。
2.reverse
reverse()
函数用于反转容器中的元素顺序。
以下是reverse()
函数的用法:
template <class BidirectionalIterator>
void reverse(BidirectionalIterator first, BidirectionalIterator last);
该函数接受两个迭代器参数:
first
:表示要反转范围的起始位置的迭代器。last
:表示要反转范围的结束位置的迭代器。反转操作将应用于范围[first, last)
内的元素。
reverse()
函数将范围 [first, last)
中的元素顺序进行反转。
示例用法:
#include <algorithm>
#include <vector>
int main() {
std::vector<int> nums = {1, 2, 3, 4, 5};
// 反转范围 [nums.begin(), nums.end()) 的元素
std::reverse(nums.begin(), nums.end());
// 输出反转后的结果:{5, 4, 3, 2, 1}
for (const auto& num : nums) {
std::cout << num << " ";
}
return 0;
}
上述示例中,reverse()
函数将容器 nums
中的元素顺序进行反转,得到了新的元素顺序 {5, 4, 3, 2, 1}
。
该题AC代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define INF (long long)2e+18
const int N = 2e6 + 10;
const int mod = 1e9;
void solve()
{
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
int pmx = find(a.begin(), a.end(), n) - a.begin();
if (pmx == 0 && n > 1)
{
pmx = find(a.begin(), a.end(), n - 1) - a.begin();
}
vector<int> b(n);
vector<int> ans(n);
vector<int> cun(n);
cun = a;
sort(cun.begin(), cun.end());
b = a;
ans = cun;
if (pmx == n - 1)
for (int i = 0; i < n; i++)
{ // r==n 的情况
b = a;
reverse(b.begin() + i, b.end());
rotate(b.begin(), b.begin() + i, b.end());
ans = max(ans, b);
}
else
for (int i = 0; i < pmx; i++)
{
b = a;
reverse(b.begin() + i, b.begin() + pmx);
rotate(b.begin(), b.begin() + i, b.end());
rotate(b.begin(), b.begin() + pmx - i, b.end() - i);
ans = max(ans, b);
}
for (int i = 0; i < n; i++)
{
cout << ans[i] << ' ';
}
cout << '\n';
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T = 1;
cin >> T;
while (T--)
{
solve();
}
}