D. Equalize Them All

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;
}

猜你喜欢

转载自blog.csdn.net/m0_60610120/article/details/129303055