【两年前的执念】论直通春晚赛制的不合理性
昨天在搜王啸坤的歌,然后搜到了一首在声动亚洲上的歌,然后就想到了这个问题
高三的时候其实是很无聊的,好在我有TI(当然现在其实也是很无聊的,好在我有电脑(喂这不是重点)).当然除了TI以外,最高兴的事情就是吃饭的时候顺便看看电视(喂你是高三不是小学三年级).然后由于当时一直在看好声音和声动亚洲,所以就很"自然"的去看了直通春晚.
焦点在于,倒数第二场比赛中,常石磊以几票之差输给了金池,无缘5强.当然虽然说即使石头进了5强,照样干不过平安和阿普萨萨,也干不过开挂的许艺娜,不过由于当时真的是闲得慌,所以就一直在思考这个问题:直通春晚的赛制真的合理么?
首先,我们要科普一下当年的赛制.当年是一共决出前三名可以登上春晚舞台,最终是平安,阿普萨萨,许艺娜上了.然后每场的赛制各不相同,但是基本都是偏淘汰赛的.
比如说,有一场9进5的比赛,赛制是这样的:首先各位选手演唱一首曲目,然后由评委评分,得分最低的直接淘汰.然后剩下8人中得分较高的4人抽签分两队PK.胜者晋级,败者和余下4人抽签分三组PK,每组胜者晋级,败者淘汰.
当时的场面是这样的:组内有金池,许艺娜,常石磊和孙伯纶以及炮灰5名.然后很自然的前4者得分前4,金池胜常石磊,许艺娜胜孙伯纶.看到这里我就在想,如果第三轮PK石头抽到孙伯纶不是就GG了么...不过这种.2概率的事情最后也没有发生,但是对于赛制的问题就是这时候开始想的.
那么我们可以进行一些假设:
1.选手的水平在一个区间内呈均匀分布
2.评委打分可以由选手发挥的水平直接决定
于是就有了这样一个程序:
#include<iostream>
#include<ctime>
#include<cstdlib>
#include<cmath>
using namespace std;
int randint(int low,int top){
return floor(low+(1.0*rand()/RAND_MAX)*(top-low+1));
};
int compare(const void *a, const void *b){
int *pa=(int*)a;
int *pb=(int*)b;
return (*pa)-(*pb);
};
int main(){
srand(unsigned(time(0)));
for (int aaa=0;aaa<20;aaa++){
int low[]={1,2,3,4,5,70,80,90,99};
int high[]={2,3,4,5,6,80,90,100,100};
int sc[]={0,0,0,0,0,0,0,0,0};
int four[]={0,0,0,0};
int five[]={0,0,0,0,0};
int tt_1=0,tt_2;
for (int i=0;i<9;i++){
sc[i]=randint(low[i],high[i]);
if (sc[tt_1]>sc[i])tt_1=i;
}
// cout<<"第一轮淘汰:"<<tt_1<<"\n";
for (int i=0;i<4;i++){
tt_2=0;
for (int k=0;k<9;k++){
if (sc[k]>sc[tt_2]){
tt_2=k;
}
}
four[i]=tt_2;
sc[tt_2]=0;
// cout<<tt_2<<"进入第二轮"<<"\n";
}
tt_2=randint(1,3);
// cout<<four[0]<<"与"<<four[tt_2]<<"PK,";
if (randint(low[four[0]],high[four[0]])>randint(low[four[tt_2]],high[four[tt_2]])){
// cout<<four[0]<<"胜\n";
five[0]=four[0];
}else{
// cout<<four[tt_2]<<"胜\n";
five[0]=four[tt_2];
}
if (tt_2==1){
four[0]=four[2];
four[1]=four[3];
}else if(tt_2==2){
four[0]=four[3];
}else{
four[0]=four[2];
}
// cout<<four[0]<<"与"<<four[1]<<"PK,";
if (randint(low[four[0]],high[four[0]])>randint(low[four[1]],high[four[1]])){
// cout<<four[0]<<"胜\n";
five[1]=four[0];
}else{
// cout<<four[1]<<"胜\n";
five[1]=four[1];
}
for (int i=0;i<9;i++){
sc[i]=1;
}
sc[tt_1]=0;
sc[five[0]]=0;
sc[five[1]]=0;
// cout<<"第三组PK开始\n";
for (int i=0;i<3;i++){
for (int k=0;k<2;k++){
int m;
do{
m=randint(0,8);
}while (sc[m]==0);
four[k]=m;
sc[m]=0;
}
// cout<<four[0]<<"与"<<four[1]<<"PK,";
if (randint(low[four[0]],high[four[0]])>randint(low[four[1]],high[four[1]])){
// cout<<four[0]<<"胜\n";
five[i+2]=four[0];
}else{
// cout<<four[1]<<"胜\n";
five[i+2]=four[1];
}
}
qsort(five,5,sizeof(int),compare);
for (int i=0;i<5;i++){
cout<<five[i]<<"\t";
}
cout<<"\n";
}
return 0;
}
运行结果:
可以看出,在实力差距很悬殊的情况下,结果相对是比较稳定的.那么如果我们缩小实力的差距:
int low[]={1,2,3,4,50,70,60,90,99};
int high[]={2,3,4,5,100,80,90,100,100};
这样的话,就会这样:
可以看出,56号是否晋级开始胶着.不过由于456实力的期望值相同,因此我们要把他们改成不同的
int low[]={1,2,3,4,50,50,50,90,99};
int high[]={2,3,4,5,100,80,90,100,100};
可以看到,6甚至有一次把7逆袭了.不过这不是重点,但是总体而言6的晋级几率还是大于5的
那么搞了这么多我想表达什么呢
其实我也不知道我想表达什么