ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SYCOJ906瑞士轮

2021-07-13 01:32:49  阅读:200  来源: 互联网

标签:++ win lose grade int 瑞士 SYCOJ906 total


题目—瑞士轮 (shiyancang.cn)

模拟题

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+520;
int n,r,q,res1=1,res2=1;
struct grade
{
	int total,num,abi;
}a[N*4],win[N*4],lose[N*4];
bool cmp(grade x,grade y)
{
	return x.total>y.total||x.total==y.total&&x.num<y.num;
}
void merge_sort(int res1,int res2)
{
	int l=1,w=1,cnt=1;
	while(l<res1&&w<res2)
	{
		if(cmp(win[l],lose[w])) a[cnt++]=win[l++];
		else a[cnt++]=lose[w++];
	}
	while(l<res1) a[cnt++]=win[l++];
	while(w<res2) a[cnt++]=lose[w++];
}
int main()
{
	scanf("%d%d%d",&n,&r,&q);
	for(int i=1;i<=n*2;i++) scanf("%d",&a[i].total);
	for(int i=1;i<=n*2;i++) scanf("%d",&a[i].abi),a[i].num=i; 
	sort(a+1,a+1+n*2,cmp);
//	for(int i=1;i<=n*2;i++) cout<<a[i].total<<" ";
//	puts("");
	while(r--)
	{
		res1=1,res2=1;
		for(int i=1;i<=n;i++)
		{
			if(a[i*2-1].abi>a[i*2].abi) a[i*2-1].total++,win[res1++]=a[i*2-1],lose[res2++]=a[i*2];
			else a[i*2].total++,win[res1++]=a[i*2],lose[res2++]=a[i*2-1];
		}
//		sort(a+1,a+1+n*2,cmp); 卡sort 
//		for(int i=1;i<=n*2;i++) cout<<a[i].total<<' ';
//		puts("");
//		for(int i=1;i<=n*2;i++) cout<<a[i].num<<' ';
//		puts("");
		merge_sort(res1,res2); 
	}
	cout<<a[q].num<<'\n';
	return 0;
}

  如果是每次用sort会超时。

这题是一道归并题,记录每一次的win and lose ,因为本身按照排名来算的,那么其本身就是有序的,所以完全可以在o(n)内完成操作,每次的名次在比完直接可以知道,那么直接按照归并双指针合并即可。

标签:++,win,lose,grade,int,瑞士,SYCOJ906,total
来源: https://www.cnblogs.com/Astronaut0142/p/15004685.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有