洛谷1309 歸併的思想
阿新 • • 發佈:2018-12-04
https://www.luogu.org/problemnew/show/P1309
開始是強行排序,過不去,後來瞥了一眼是歸併排序,就寫了歸併排序,還是tle。看了人家的思路才發現問題,暴漏了自己的問題:思考的太少了。
因為變化並不是很大,每一輪比賽的勝者他們的score都+1,勝者的排序跟這場比賽開始之前一樣,同樣的,敗者也是。這樣在申請兩個陣列,一個裝winner,一個裝loser。
#include <bits/stdc++.h> using namespace std; const int maxn=100005; struct Node{ int num; int score,power; bool operator<(const Node a)const{ if(this->score!=a.score) return this->score>a.score; else return this->num<a.num; } bool operator>(const Node a)const{ if(this->score!=a.score) return this->score>a.score; else return this->num<a.num; } }a[maxn*2],win[maxn],lose[maxn]; int N,R,Q; void mergsort() { int i,j,k; for(i=1,j=1,k=1;i<=N;i++){//先提取出來 if(a[2*i-1].power>a[i*2].power){//進行比較用過載的大於號, win[j]=a[2*i-1]; win[j].score++; lose[k]=a[i*2]; }else{ win[j]=a[2*i]; win[j].score++; lose[k]=a[i*2-1]; } j++,k++; } for(i=1,j=1,k=1;i<=2*N&&j<=N&&k<=N;i++){ if(win[j]>lose[k]) a[i]=win[j++]; else a[i]=lose[k++]; } for(j;j<=N;j++) a[i++]=win[j]; for(k;k<=N;k++) a[i++]=lose[k]; } int main() { int i,j,k; scanf("%d %d %d",&N,&R,&Q); for(i=1;i<=N*2;i++){ a[i].num=i; scanf("%d",&a[i].score); } for(i=1;i<=N*2;i++) scanf("%d",&a[i].power); sort(a+1,a+1+N*2); for(i=0;i<R;i++){ mergsort(); } printf("%d",a[Q].num); return 0; }