P1309 瑞士轮——排序

题目大概意思是每次相邻分数的两个人根据实力值进行比较,然后输赢分治,不断排序。
刚开始直接在每次比赛完之后直接sort一遍,然后发现超时了,时间复杂度达到了O(RNlogN)。
后面观察了一波题目给的比赛表,发现根本不需要sort,每次比赛完把胜者与败者分离,再依据分数高低合并胜者与败者数组,即可将复杂度降到O(RN),达到题目符合的时间限制。

#include 
#include 
using namespace std;
const int maxn=100005;
struct node
{
    int id,weight,score;//id表示序号,weight表示实力,score表示分数
};
int n,r,q,w,s;
node p[maxn*2],win[maxn],lose[maxn];//win表示胜者,lose表示败者

bool cmp(node x,node y)//比较的标准,分数不一样按分数降序排序,分数一样按序号升序排序
{
    if(x.score==y.score)
        return x.idy.score;
}

void merge(node *tmp,node *a,int len_a,node *b,int len_b)//合并胜者与败者数组
{
    int i=1,j=1,k=1;
    while(i<=len_a&&j<=len_b)
    {
        if((a[i].score>b[j].score)||((a[i].score==b[j].score)&&(a[i].id>n>>r>>q;
    for(int i=1;i<=2*n;i++)
    {
        cin>>s;
        p[i].id=i;
        p[i].score=s;
    }
    for(int i=1;i<=2*n;i++)
    {
        cin>>w;
        p[i].weight=w;
    }
    sort(p+1,p+2*n+1,cmp);//对初始状态排序
    for(int i=1;i<=r;i++)
    {
        int k=1;
        for(int j=1;j<=2*n;j+=2)//分离胜者与败者
        {
            if(p[j].weight>p[j+1].weight)
            {
                p[j].score++;
                win[k]=p[j];
                lose[k]=p[j+1];
                k++;
            }
            else
            {
                p[j+1].score++;
                win[k]=p[j+1];
                lose[k]=p[j];
                k++;
            }
        }
        merge(p,win,n,lose,n);//比完赛以后合并胜者与败者
    }
    cout<

p.s. 题目样例给的比赛表
P1309 瑞士轮——排序_第1张图片

你可能感兴趣的:(康复训练)