洛谷瑞士轮/merge/归并排序

瑞士轮

//没看清楚数组的大小WA了N次,陷入暴风雨式的哭泣
https://www.luogu.org/problemnew/show/P1309
刚开始直接 全部sort ,然后超时了,
这道题关键在于先用sort 把没有顺序的数组快速排序 然后归并排序,(将两个有序的数组合并)

#include<bits/stdc++.h>
using namespace std;
struct note{
	int bh;
	int w;
	int fs;

}aa[200000+10],mm[100010],nn[100010];
int cmp(struct note aa1,struct note aa2){
	if(aa1.fs !=aa2.fs ) return aa1.fs >aa2.fs ;
	 return aa1.bh <aa2.bh ;
}
int main(){
	int n,r,q;
	scanf("%d%d%d",&n,&r,&q);
	int i;
	for(i=0;i<2*n;i++){
		scanf("%d",&aa[i].fs );
		aa[i].bh =i+1;
	}
	for(i=0;i<2*n;i++){
		scanf("%d",&aa[i].w );
		
	}
	sort(aa,aa+2*n,cmp);
	while(r--){
		int qq=0;
		for(i=0;i<2*n;i+=2,qq++){
		if(aa[i].w >aa[i+1].w ){
			aa[i].fs ++;
			mm[qq]=aa[i];
			nn[qq]=aa[i+1];
		
		}else {
			aa[i+1].fs ++;
			mm[qq]=aa[i+1];
			nn[qq]=aa[i];
		
		}
		
	}	i=0;
		int j=0,k=0;
	while(i<n&&j<n){
		if(cmp(mm[i],nn[j])){
			aa[k]=mm[i];
			i++;
		
		}else {
			aa[k]=nn[j];
			j++;
		
		}
			k++;
	}
	while(i<n){
	aa[k]=mm[i];
	i++;
	k++; 
	}
	while(j<n){
	aa[k]=nn[j];
	j++;
	k++; 
	}
	}
	printf("%d",aa[q-1].bh );
	return 0;

	
}
	

STL中的merge  /并不是特别懂怎么用
查了一下 
原文:https://blog.csdn.net/shudaqi2010/article/details/22985991
merge函数的作用是:将两个有序的序列合并为一个有序的序列。函数参数:
  merge(first1,last1,first2,last2,result,compare);

//firs1t为第一个容器的首迭代器,last1为第一个容器的末迭代器,first2为第二个容器的首迭代器,last2为容器的末迭代器,result为存放结果的容器,comapre为比较函数(可略写,默认为合并为一个升序序列)。

#include<bits/stdc++.h>
using namespace std;
struct note{
	int bh;
	int w;
	int fs;

}aa[200000+10],mm[100010],nn[100010];
int cmp(struct note aa1,struct note aa2){
	if(aa1.fs !=aa2.fs ) return aa1.fs >aa2.fs ;
	 return aa1.bh <aa2.bh ;
}
int main(){
	int n,r,q;
	scanf("%d%d%d",&n,&r,&q);
	int i;
	for(i=1;i<=2*n;i++){
		scanf("%d",&aa[i].fs );
		aa[i].bh =i;
	}
	for(i=1;i<=2*n;i++){
		scanf("%d",&aa[i].w );
		
	}
	sort(aa+1,aa+1+2*n,cmp);
	while(r--){
		int qq=1;
		for(i=1;i<=2*n;i+=2,qq++){
		if(aa[i].w >aa[i+1].w ){
			aa[i].fs ++;
			mm[qq]=aa[i];
			nn[qq]=aa[i+1];
		
		}else {
			aa[i+1].fs ++;
			mm[qq]=aa[i+1];
			nn[qq]=aa[i];
		
		}
		
	}
	merge(mm+1,mm+n+1,nn+1,nn+n+1,aa+1,cmp);
	}
	printf("%d",aa[q].bh );
	return 0;

	
	
	
}

猜你喜欢

转载自blog.csdn.net/weixin_43880084/article/details/85032879