P1309 [NOIP2011 普及组] 瑞士轮 归并算法

编程入门 行业动态 更新时间:2024-10-11 07:27:44

P1309 [NOIP2011 普及组] <a href=https://www.elefans.com/category/jswz/34/1766731.html style=瑞士轮 归并算法"/>

P1309 [NOIP2011 普及组] 瑞士轮 归并算法

知识点:

1.归并算法的应用

2.自定义sort函数对结构体的排序

总思路:首先,初排序,根据排名两两比赛,分数变化,再排名,循环r次

坑:

1.结构体赋值考虑是 整体赋值 还是 分数 编号 的赋值

2.记录胜负的两组数组是int型还是自定义型

3.归并函数里 while的次数

代码如下

//归并使用在给分数排序的时候
#include<iostream>
#include<algorithm>using namespace std;int n,r,q;struct happy{int s,w,hao;
}a[200050],win[100010],lose[100010];bool cmp(happy x,happy y)
{if(x.s==y.s) return x.hao<y.hao;else return x.s>y.s;
}void dfs()
{n/=2;int i,j,b;i=j=b=1;while(i<=n&&j<=n){if(cmp(win[i],lose[j])) a[b++]=win[i++];else a[b++]=lose[j++];}while(i<=n) a[b++]=win[i++];while(j<=n) a[b++]=lose[j++];n*=2;
}int main()
{cin>>n>>r>>q;n*=2;for(int i=1;i<=n;i++) a[i].hao=i;for(int i=1;i<=n;i++) cin>>a[i].s;for(int i=1;i<=n;i++) cin>>a[i].w;    sort(a+1,a+n+1,cmp);//一次sort之后不再需要使用此函数——两个数组分别保存了while(r--){for(int i=1;i<=n;i+=2)if(a[i].w>a[i+1].w){a[i].s++;win[(i+1)/2]=a[i];lose[(i+1)/2]=a[i+1];}else{a[i+1].s++;win[(i+1)/2]=a[i+1];lose[(i+1)/2]=a[i];}dfs();}cout<<a[q].hao;return 0;
}

更多推荐

P1309 [NOIP2011 普及组] 瑞士轮 归并算法

本文发布于:2024-03-12 23:36:37,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1732685.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:瑞士   算法

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!