【解题报告】瑞士轮(NOIP2011普及组T3)

  【题外话:这道题吧……说实话我不太喜欢……因为卡快排。】

  题目不贴了,就是给你一个赛制,然后各个选手的初始得分和能力值,问你进行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:这里是个准初三狗,一开学成了初三狗之后估计就不会太快更新了……】

原文地址:https://www.cnblogs.com/CYWer/p/4748519.html