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

浙公网安备 33010602011771号