D. Equalize Them All
题目大意
给你 n 个数,每次操作可以选择两个相邻的数字,并把他们都变成其中一个数字。问最少需要通过几次操作能使 n 个数字变的全部相等?
题目分析
两种操作经过分析可知:
- 操作1:将a[i]变为比a[i]大的数
- 操作2:将a[i]变为比a[i]小的数、
要是操作数最小,我们只需要从出现次数最多的数字开始向两边变化,每次记录操作的下标以及使用操作的编号即可。
code
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, m, k, t;
map<int, int>q;
int a[N], b[N];
struct node
{
int k, i, j;
}ans[N];
void solve()
{
cin >> n ;
for(int i = 1; i <= n; i ++) cin >> a[i];
for(int i = 1; i <= n; i ++)
{
q[a[i]] ++;
b[a[i]] = i;
}
int tem = 0, tep;
for(auto &[k, v] : q) if(v > tem) tep = b[k], tem = v;
int cnt = 0;
for(int i = tep + 1; i <= n; i ++)
{
if(a[i] > a[tep]) ans[cnt ++] = {
2, i, i - 1};
else if(a[i] < a[tep]) ans[cnt ++] = {
1, i, i - 1};
}
for(int i = tep - 1; i >= 1; i --)
{
if(a[i] > a[tep]) ans[cnt ++] = {
2, i, i + 1};
else if(a[i] < a[tep]) ans[cnt ++] = {
1, i, i +1};
}
cout << cnt << "\n";
for(int i = 0; i < cnt; i ++)
cout << ans[i].k << " " << ans[i].i << " " << ans[i].j << "\n";
}
int main()
{
solve();
return 0;
}