ZCMU - 1992: Swiss-system tournament

简介: ZCMU - 1992: Swiss-system tournament

题目链接:点击打开链接


题目大意:给出 2*n 个人,每次第1个人和第2个人比赛,第3个人和第4个人比赛…进行 r 轮比赛,每轮比完赛都进行排名,求出最后第 q 名是谁。能力大的获胜,获胜的加 1分,输了的加 0分。


解题思路:归并排序思想,每轮比赛,把赢者放一组,输者放一组,这样单个数组t1/t2也是有序的,然后进行合并也能保证数组nds有序。


AC 代码

#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a)
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=1e5*2+10;
int len;
struct node
{
    int id,score,power;
}nds[maxn],t1[maxn],t2[maxn];
int cmp(node n1,node n2)
{
    return n1.score==n2.score?n1.id<n2.id:n1.score>n2.score;
}
void mergeArr()
{
//    printf("Before Merge :\n");
    /* nds因为第一次sort过,所以接下来分别分为 胜利组t1 和 失败组t2 */
    int k1=1,k2=1;
    for(int i=1;i<=len;i+=2)
    {
        if(nds[i].power>nds[i+1].power)
            nds[i].score++,t1[k1++]=nds[i],t2[k2++]=nds[i+1];
        else
            nds[i+1].score++,t1[k1++]=nds[i+1],t2[k2++]=nds[i];
    }
//    for(int i=1;i<k1;i++)
//    {
//        printf("%d ",t1[i].id);
//    }
//    puts("");
//    for(int i=1;i<k1;i++)
//    {
//        printf("%d ",t1[i].score);
//    }
//    puts("");
//
//    for(int i=1;i<k2;i++)
//    {
//        printf("%d ",t2[i].id);
//    }
//    puts("");
//    for(int i=1;i<k2;i++)
//    {
//        printf("%d ",t2[i].score);
//    }
//    puts("");
//
//    printf("After Merge :\n");
    /* 胜利组t1 和 失败组t2 合并为nds,而且一定保证是有序的,节省了原生归并排序的mergeSort步骤 */
    int i=1,j=1,k=1;
    while(i<k1&&j<k2)
    {
        if(t1[i].score>t2[j].score)
            nds[k++]=t1[i++];
        else if(t1[i].score==t2[j].score)
            t1[i].id<t2[j].id ? nds[k++]=t1[i++] : nds[k++]=t2[j++];
        else
            nds[k++]=t2[j++];
    }
    while(i<k1)
        nds[k++]=t1[i++];
    while(j<k2)
        nds[k++]=t2[j++];
//    for(i=1;i<=len;i++)
//    {
//        printf("%d ",nds[i].id);
//    }
//    puts("");
//    for(i=1;i<=len;i++)
//    {
//        printf("%d ",nds[i].score);
//    }
//    puts("");
}
//void mergeSort(int first, int last) // TLE
//{
//    if(first<last)
//    {
//        int m=first+((last-first)>>1);
//        mergeSort(first,m);
//        mergeSort(m+1,last);
//        mergeArr(first,m,last);
//    }
//}
int main()
{
    int T; scanf("%d",&T);
    int n,r,q;
    while(T-- && ~scanf("%d%d%d",&n,&r,&q))
    {
        len=2*n;
        for(int i=1;i<=len;i++)
        {
            nds[i].id=i;
            scanf("%d",&nds[i].score);
        }
        for(int i=1;i<=len;i++) scanf("%d",&nds[i].power);
        sort(nds+1,nds+1+len,cmp);
        for(int i=1;i<=r;i++)
        {
            mergeArr();
        }
        printf("%d\n",nds[q].id);
    }
    return 0;
}


/

目录
相关文章
|
6月前
|
Java
System.currentTimeMillis()方法总结
System.currentTimeMillis()方法总结
|
算法 Java
System类
System类
57 0
C. Registration system
C. Registration system
57 0
“System.out.println(的正确格式
“System.out.println(的正确格式
128 0
使用System.out.println()
使用System.out.println()
81 0
一次由 Scanner(System.in) 引起的 TLE
继昨天一次由System.out.println() 引起的 MLE&TLE后,今天随机到一道快速选择的题(P1923),又遇到相似的问题,写完快速排序后修改几行代码就得到快速选择的代码,本以为轻松解决问题,然后又莫名其妙的 TLE。
一次由 Scanner(System.in) 引起的 TLE
|
Java 关系型数据库 Oracle
System.out.println
This Java tutorial is to explain what System.out.println is and how it works. It is love at first type.
1177 0
|
JavaScript Linux 前端开发
|
网络协议 关系型数据库 网络安全
|
JavaScript 前端开发