P15027 [UOI 2021 II Stage] 优美数组 题解

题目传送锚点

在博客园食用更佳

题意

一句话,要把一个序列修改成两个不同的数交替出现的形式,求最小的修改次数。

思路

由题意得,奇数位上的数字相同,偶数位上的数字相同,所以第一步要处理出奇数位上不同数字的出现次数,和偶数位上不同数字的出现次数。

一般情况下,将两者整理出来后,得到奇数位上出现最多数字的出现次数,和偶数位上出现最多数字的出现次数后,将两者相加,再用 \(n\) 减去其加和就是答案。

但若奇数位和偶数位上出现最多的数相同,则需将其中一个替换为出现第二多的数,具体替换哪个看替换后的方案哪个加和更大。

思路就是这些了。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;

int n,ans,cnt1,cnt2,z[1000001];
map<int,int>a,b;

struct number
{
	int value;
	int cnt;
}x[1000001],y[1000001];

bool cmp(number a,number b)
{
	return a.cnt>b.cnt;
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie();
    cout.tie();
    cin>>n;
    for(int i=1;i<=n;++i)
    {
    	cin>>z[i];
    	if(i%2==1)
		{
			++a[z[i]];
			if(a[z[i]]==1) x[++cnt1].value=z[i];
		}
    	else
		{
			++b[z[i]];
			if(b[z[i]]==1) y[++cnt2].value=z[i];
		}
	}
	for(int i=1;i<=cnt1;++i) x[i].cnt=a[x[i].value];
	for(int i=1;i<=cnt2;++i) y[i].cnt=b[y[i].value];
	sort(x+1,x+cnt1+1,cmp);
	sort(y+1,y+cnt2+1,cmp);
	if(x[1].value!=y[1].value) cout<<n-x[1].cnt-y[1].cnt;
	else cout<<n-max(x[1].cnt+y[2].cnt,x[2].cnt+y[1].cnt);
	return 0;
}
posted @ 2026-02-11 17:58  cath20  阅读(15)  评论(0)    收藏  举报