洛谷瑞士輪/merge/歸併排序
阿新 • • 發佈:2018-12-28
瑞士輪
//沒看清楚陣列的大小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; }