字母交换
某正教授级特教师获得了一段古老的文字,全部由26个大写英文字母组大写英文字母组成。他产生了一个疯狂的想法,即把这段文字中所有母按A到Z的顺序排序,即所有序,即所有A放在开头,然后跟着所有B,再是所有,再是所有C,最后是所有Z。比如原字符串为“HELLOWORLD”,排序后应变为“DEHLLLOORW”。但是特教毕竟领着国务院的特殊津贴,于是他还有一个要求,即有一个要求,即排序时每次只能交换相邻两个字每次只能交换相邻两个字每次只能交换相邻两个字每次只能交换相邻两个字每次只能交换相邻两个字母。现在他想知道最少交换多少次能完成交换?
这个题一眼就看出来求逆序对。
随便怎么求都行
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int e[2000010],tmp1[2000010];
long long ans;
void merge(int left, int mid, int right)
{
int i=left, j=mid+1, k=left;
while (i<=mid && j<=right) {
if (e[i]<=e[j]) {
tmp1[k++] = e[i++];
} else {
tmp1[k++] = e[j++];
ans = ans+mid-i+1;
}
}
while (i<=mid) tmp1[k++] = e[i++];
while (j<=right)tmp1[k++] =e[j++];
memcpy(&e[left], &tmp1[left], (right-left+1)*sizeof(int));
}
void merge_sort(int left, int right)
{
if (left<right)
{
int mid=(left+right)>>1;
merge_sort(left, mid);
merge_sort(mid+1, right);
merge(left, mid, right);
}
}
int main()
{
freopen("swapping.in","r",stdin);
freopen("swapping.out","w",stdout);
char s;
int k=0;
while (cin>>s)
{
k++;
e[k]=s-48;
}
merge_sort(1,k);
cout<<ans;
}