瑞士轮
//没看清楚数组的大小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;
}