洛谷 1309




题意及思路

  • 题意:题意见上图,很明确,纯暴力可以做出来正确结果,但是会出现超时情况。
  • 思路:①😅纯纯的想法是,将这些数据封装成一个结构体,然后进行r次排序,比较,最后输出即可,😒不过这样太暴力,不可取。②😏改进的方法是,洛谷题解的好想法。就是每次pk完后,🙂分成两拨,一波是赢家,一波是输家。每一次比赛后合并。附上链接。


代码

#include<bits/stdc++.h>

using namespace std;

const int M = 2e5+5;
int n,r,q;

typedef struct A{
	int g,no,w; //得分、编号、实力值 
}Node;

int aL,wL,lL;
Node all[M],win[M],lose[M];

bool cmp(Node a,Node b){
	if(a.g!=b.g) return a.g > b.g;
	return a.no < b.no;
}

void merge(){
	int i=1,j=1;
	aL = 0;
	while(i<=wL && j<=lL){
		if(cmp(win[i],lose[j])) all[++aL] = win[i++];
		else all[++aL] = lose[j++];
	}
	while(i<=wL) all[++aL] = win[i++];
	while(j<=lL) all[++aL] = lose[j++];
}

int main()
{
	std::ios::sync_with_stdio(false);
    cin.tie(0);
	cin >> n >> r >> q;
	for(int i=1;i<=2*n;i++){
		cin >> all[i].g;
		all[i].no = i;
	}
	for(int i=1;i<=2*n;i++){
		cin >> all[i].w;
	}
	
	sort(all+1,all+1+2*n,cmp);
	while(r--){
		wL = lL = 0;
		for(int i=1;i<2*n;i+=2){
			if(all[i].w>all[i+1].w){
				all[i].g++;
				win[++wL] = all[i];
				lose[++lL] = all[i+1];
			}else{
				all[i+1].g++;
				win[++wL] = all[i+1];
				lose[++lL] = all[i];
			}
		}
		merge();
	}
	cout << all[q].no << endl;
    
	return 0;
}



全部评论

相关推荐

点赞 收藏 评论
分享
正在热议
# 牛客帮帮团来啦!有问必答 #
1150519次浏览 17147人参与
# 通信和硬件还有转码的必要吗 #
11172次浏览 101人参与
# 不去互联网可以去金融科技 #
20261次浏览 255人参与
# 和牛牛一起刷题打卡 #
18781次浏览 1635人参与
# 实习与准备秋招该如何平衡 #
203300次浏览 3625人参与
# 大厂无回复,继续等待还是奔赴小厂 #
4941次浏览 30人参与
# OPPO开奖 #
19172次浏览 267人参与
# 通信硬件薪资爆料 #
265820次浏览 2484人参与
# 国企是理工四大天坑的最好选择吗 #
2199次浏览 34人参与
# 互联网公司评价 #
97640次浏览 1279人参与
# 简历无回复,你会继续海投还是优化再投? #
25032次浏览 354人参与
# 0offer是寒冬太冷还是我太菜 #
454755次浏览 5124人参与
# 国企和大厂硬件兄弟怎么选? #
53883次浏览 1012人参与
# 参加过提前批的机械人,你们还参加秋招么 #
14628次浏览 349人参与
# 硬件人的简历怎么写 #
82281次浏览 852人参与
# 面试被问第一学历差时该怎么回答 #
19377次浏览 213人参与
# 你见过最离谱的招聘要求是什么? #
27962次浏览 247人参与
# 学历对求职的影响 #
161183次浏览 1804人参与
# 你收到了团子的OC了吗 #
538610次浏览 6386人参与
# 你已经投递多少份简历了 #
344081次浏览 4963人参与
# 实习生应该准时下班吗 #
96945次浏览 722人参与
# 听劝,我这个简历该怎么改? #
63510次浏览 622人参与
牛客网
牛客企业服务