题目链接:点击打开链接
题目大意:给出 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; }
/