1. 程式人生 > >洛谷1309 歸併的思想

洛谷1309 歸併的思想

 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;
}