原题https://www.luogu.org/problemnew/show/P1309
题解:这个题目全程调用sort()会超时,考虑到数据都是基本有序的这一特点,应选择归并排序。快速排序适用于数据顺序比较随机的情况。
#include<bits/stdc++.h>
using namespace std;
struct NODE
{
int score;
int sl;
int bh;
};
int n;
NODE xuan[200005];
NODE win[100005];
NODE lose[100005];
bool cmp(NODE x,NODE y)
{
if(x.score!=y.score) return x.score>y.score;
else return x.bh<y.bh;
}
void merge()
{
int i=1,j=1,k=1;
while(i<=n&&j<=n)
{//结构体赋值可以直接来
if(win[i].score>lose[j].score) xuan[k++]=win[i++];
if(win[i].score<lose[j].score) xuan[k++]=lose[j++];
if(win[i].score==lose[j].score&&win[i].bh<lose[j].bh) xuan[k++]=win[i++];
if(win[i].score==lose[j].score&&win[i].bh>lose[j].bh) xuan[k++]=lose[j++];
}
while(i<=n) {xuan[k++]=win[i++];}
while(j<=n) {xuan[k++]=lose[j++];}
}
int main()
{
int k,i,r,q,nn;
cin>>n>>r>>q;
nn=n<<1;
for(i=1;i<=nn;i++) cin>>xuan[i].score;
for(i=1;i<=nn;i++) {cin>>xuan[i].sl;xuan[i].bh=i;}
sort(xuan+1,xuan+nn+1,cmp);
for(k=0;k<r;k++)
{
for(i=1;i<=n;i++)
{
if(xuan[i*2-1].sl>xuan[2*i].sl)
{
win[i]=xuan[i*2-1];lose[i]=xuan[2*i];win[i].score++;
}
else
{
win[i]=xuan[2*i];lose[i]=xuan[i*2-1];win[i].score++;
}
}
merge();
}
cout<<xuan[q].bh<<endl;
// for(i=1;i<=nn;i++) cout<<xuan[i].bh<<' '<<xuan[i].score<<' '<<xuan[i].sl<<endl;
}
以上代码中的归并排序采用了非递归形式,下面是递归形式的归并排序
#include<bits/stdc++.h>
using namespace std;
int A[100];
const int maxn=100;
void merge(int A[],int L1,int R1,int L2,int R2){
int i=L1,j=L2;
int temp[maxn],index=0;
while(i<=R1&&j<=R2){
if(A[i]<=A[j]){
temp[index++]=A[i++];
}else{
temp[index++]=A[j++];
}
}//index是temp数组的下标
while(i<=R1) temp[index++]=A[i++];
while(j<=R2) temp[index++]=A[j++];
for(i=0;i<index;i++){
A[L1+i]=temp[i];
}
}
void mergeSort(int A[],int left,int right){
if(left<right){
int mid=(left+right)/2;
mergeSort(A,left,mid);
mergeSort(A,mid+1,right);
merge(A,left,mid,mid+1,right);
}
}
int main()
{
int i,j,n;
cin>>n;
for(i=1;i<=n;i++) cin>>A[i];
cout<<endl;
mergeSort(A,1,n);
for(i=1;i<=n;i++) cout<<A[i]<<' ';
}