题解:P12688 [KOI 2022 Round 1] 避开
· 阅读需 1 分钟
原题链接
题意简述
给定长度为 的整数序列 ,一次操作可交换相邻两数。求最少交换次数,使序列中 奇数 与 偶数 最多相邻一次。
解题思路
奇偶最多相邻一次,显然最终序列只能是 奇数段+偶数段 或 偶数段+奇数段。
选定一种奇偶性 全部压到左端。
对于第 个奇偶性为 的元素,当前下标为 ,目标下标为 ,需要交换 次。
最终答案为 和 两种情况的最小值。
参考代码
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=1000005;
int a[N];
ll calc(int n,int p)
{
ll res=0,k=0;
for(int i=1;i<=n;i++)
{
if((a[i]&1)==p)res+=i-(++k);
}
return res;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
cout<<min(calc(n,0),calc(n,1))<<'\n';
return 0;
}