1. 程式人生 > >洛谷瑞士輪/merge/歸併排序

洛谷瑞士輪/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;

	
	
	
}