【题外话:这道题吧……说实话我不太喜欢……因为卡快排。】
题目不贴了,就是给你一个赛制,然后各个选手的初始得分和能力值,问你进行R轮比赛之后第Q名的编号是多少(这个编号读进来就要算OYZ,初始快排的时候也要注意。)
我是用的比较常规的方法,每次扫描整个序列,计算胜者和负者,分入两个数组,然后把这两个数组归并回原来的序列里(因为这两个序列都已经有序,所以可以免去排序直接合并),题目中要求编号小的排在前面,因为归并是稳定排序所以不需要担心这些。
其实本质来说就是个讲究技巧的模拟吧?
下贴代码,风格照样丑。
1 #include <algorithm> 2 #include <iostream> 3 #include <fstream> 4 #include <cstdlib> 5 #include <cstring> 6 #include <cmath> 7 using namespace std; 8 ifstream fin("swiss.in"); 9 ofstream fout("swiss.out"); 10 struct per 11 { 12 int fs; 13 int nl; 14 int bh; 15 }; 16 per player[200005]; 17 int Rs=0,ls=0,gz=0; 18 per winner[100005]={0},loser[100005]={0}; 19 void Heib(); 20 bool px(per a,per b); 21 int main(void) 22 { 23 fin>>Rs>>ls>>gz; 24 Rs*=2; 25 for(int i=1;i<=Rs;i++) 26 { 27 fin>>player[i].fs; 28 player[i].bh=i; 29 } 30 for(int i=1;i<=Rs;i++)fin>>player[i].nl; 31 sort(player+1,player+Rs+1,px); 32 for(int i=1;i<=ls;i++) 33 { 34 for(int j=1;j<=Rs;j++) 35 { 36 if(j%2==0) 37 { 38 if(player[j].bh==127||player[j-1].bh==127) 39 { 40 } 41 if(player[j].nl>player[j-1].nl) 42 { 43 winner[j/2].bh=player[j].bh; 44 winner[j/2].fs=player[j].fs+1; 45 winner[j/2].nl=player[j].nl; 46 loser[j/2].bh=player[j-1].bh; 47 loser[j/2].fs=player[j-1].fs; 48 loser[j/2].nl=player[j-1].nl; 49 } 50 else 51 { 52 winner[j/2].bh=player[j-1].bh; 53 winner[j/2].fs=player[j-1].fs+1; 54 winner[j/2].nl=player[j-1].nl; 55 loser[j/2].bh=player[j].bh; 56 loser[j/2].fs=player[j].fs; 57 loser[j/2].nl=player[j].nl; 58 } 59 } 60 } 61 Heib(); 62 } 63 fout<<player[gz].bh; 64 return 0; 65 } 66 67 bool px(per a,per b) 68 { 69 if(a.fs>b.fs)return 1; 70 if(a.fs==b.fs&&a.bh<b.bh)return 1; 71 if(a.fs==b.fs&&a.bh>b.bh)return 0; 72 return 0; 73 } 74 75 76 void Heib() 77 { 78 int lf=1,rt=1,zz=1; 79 while(lf<=Rs/2&&rt<=Rs/2) 80 { 81 if(winner[lf].fs>loser[rt].fs||(winner[lf].fs==loser[rt].fs&&winner[lf].bh<loser[rt].bh)) 82 { 83 player[zz].bh=winner[lf].bh; 84 player[zz].fs=winner[lf].fs; 85 player[zz].nl=winner[lf].nl; 86 zz++; 87 lf++; 88 } 89 if(winner[lf].fs<loser[rt].fs||(winner[lf].fs==loser[rt].fs&&winner[lf].bh>loser[rt].bh)) 90 { 91 player[zz].bh=loser[rt].bh; 92 player[zz].fs=loser[rt].fs; 93 player[zz].nl=loser[rt].nl; 94 zz++; 95 rt++; 96 } 97 } 98 while(lf<=Rs/2||rt<=Rs/2) 99 { 100 if(lf<=Rs/2) 101 { 102 player[zz].bh=winner[lf].bh; 103 player[zz].fs=winner[lf].fs; 104 player[zz].nl=winner[lf].nl; 105 lf++; 106 } 107 if(rt<=Rs/2) 108 { 109 player[zz].bh=loser[rt].bh; 110 player[zz].fs=loser[rt].fs; 111 player[zz].nl=loser[rt].nl; 112 rt++; 113 } 114 zz++; 115 } 116 return; 117 } 118 119
【题外话2:其实两篇解题报告之间我还A了几道题,不过都太简单或者太恶心到我不想写题解……OYZ】
【题外话3:这里是个准初三狗,一开学成了初三狗之后估计就不会太快更新了……】