ICode9

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

[2011年NOIP普及组] 瑞士轮

2022-08-13 16:00:41  阅读:175  来源: 互联网

标签:分数 node 普及 ma NOIP int win ++ 2011


[2011年NOIP普及组] 瑞士轮

  • 分析:根据题意,定义结构体,将选手的序号,初始分数,实力值联系起来,在最开始先给数据排个序,跟据题意手打排序。在此我们要注意一个问题,我们已经按照分数排成有序的,那么前面的人分数一定比后面的人高,赢的人都+1,所以每次先赢的人总会在后赢的人前面,输的相同,因此我们可以将赢和输分成两个队伍。然后将每次的两个队伍实力值进行比较,赢的放入一个数组且分数+1,输的放入一个数组,最后用merge函数将这两个数组进行合并拼接排序,输出第q名的序号。
  • #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    struct node
    {
    int num;//序号
    int ma;//初始分数
    int st;//实力值
    };
    node a[1000001],w[1000001],l[1000001];
    bool cmp(node x,node y)
    {
    if(x.ma>y.ma) return true;
    else if(x.ma<y.ma) return false;
    else
    {
    if(x.num<y.num) return true;
    else return false;
    }
    }
    int main()
    {
    int n,r,q;//n名选手 r轮比赛 排名第q
    cin>>n>>r>>q;
    for(int i=1;i<=n*2;i++)
    {
    cin>>a[i].ma;
    a[i].num=i;
    }
    for(int i=1;i<=n*2;i++)//有2*n名学生
    cin>>a[i].st;
    sort(a+1,a+1+n*2,cmp);
    for(int i=1;i<=r;i++)//在r轮比赛中
    {
    int win=0,lose=0;
    for(int j=1;j<=2*n;j+=2)//因为是前后两名之间的比较,所以这里可以直接j+=2
    {
    if(a[j].st>a[j+1].st)//a[j]赢
    {
    w[++win]=a[j];//赢的数组和输的数组都加
    w[win].ma++;//赢得分数也加
    l[++lose]=a[j+1];
    }
    else //同理
    {
    w[++win]=a[j+1];
    w[win].ma++;
    l[++lose]=a[j];
    }
    }
    merge(w+1,w+1+win,l+1,l+1+lose,a+1,cmp);//合并拼接
    }
    cout<<a[q].num<<endl;
    return 0;
    }

标签:分数,node,普及,ma,NOIP,int,win,++,2011
来源: https://www.cnblogs.com/xdzxjinghan/p/16583219.html

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

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

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

ICode9版权所有