题目:https://codeforces.com/problemset/problem/1556/B
题意:
给定一个序列,每次操作允许交换相邻的位置,求最少需要几次操作可以使得这个序列奇偶交错
题解:
我们可以将序列分成4种情况:
- 奇数 偶数 的数量不匹配,即奇偶差大于1。
- 奇数=偶数+1,说明变换后的序列是 奇偶......偶奇?的形式。
- 偶数=奇数+1,同理变换后的序列是 偶奇......奇偶?的形式。
- 奇数=偶数,存在以上两种可能性,取最小值。
我们可以对变换后的情况和变换前的情况做比较,如:【1,1,1,2,2,2】先提取出全部的奇数【1,1,1】;改变前的位置是{0, 1, 2}改变后的位置是{0,2,4},对其进行比较得出ansj=(0-0)+(2-1)+(4-2)=3;
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long int ll;
const int N = 1e5 + 5;
int a[N];
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
int j = 0, o = 0;
ll ansj = 0, anso = 0, cntj = 0, cnto = 0;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
if (a[i] % 2)
{
j++;
ansj += abs(i - cntj * 2);
cntj++;
}
else
{
o++;
anso += abs(i - cnto * 2);
cnto++;
}
}
if (abs(j-o) > 1)
cout << -1 << endl;
else
if (j == o)
cout << min(ansj, anso) << endl;
else if (j > o)
cout << ansj << endl;
else if (o > j)
cout << anso << endl;
}
}
|