Homework 2
HOMework 2
本次小作业难度较低,大部分代码可以直接AC,比较有趣的一道题需要逆序merge_sort,记录一下
题目:1285. イレイナ爱排序
https://acm.sjtu.edu.cn/OnlineJudge/problem/1285
这道题说的是通过给定的次数来找到一个数组的排序,首先我们这么想,对于一个无序的数列,我们需要进行merge的时候,除了第一次进入merge,剩下每一次都要两次merge,最多会到达把一个逆序对拆分的地步。所以反过来,没两个merge操作代表有一个交换,出现一个逆序对,而这个是由上到下的,如果逆序对出现同一侧(l ~ mid
)那么实际上会继续进行2^n次的操作,所以我们必须保证在每层merge交换mid的左右两侧,这样才能保证这一次交换只消耗两次merge,所以可以写出我们的merge程序
而最开始我把k加到了merge的参数之中,但是后来却不太清楚该怎么书写,因为k= 2,如果进入两个子函数,相当于进行4次,但是把k拿到外面作为全局变量就迎刃而解力。
int k;
void reverse_merge_sort(int l,int r) {
if(k == 0) { // k == 0 说明次数到达,设定flag = true
flag = true;
return;
}
if(l>=r) {
return; //到达边界
}
int mid = (l+r)>>1;
if(l == mid)
return;
swap(Q[mid-1],Q[mid]);
k-=2;//每一次swap让k-2
reverse_merge_sort(l,mid);
if(k == 0) {
return;
}
reverse_merge_sort(mid,r);
}
共勉