暴力法,加了个动态分配内存,请忽视
代码如下:
#include<iostream>
using namespace std;
class game{
private:
bool* mark;
int *team,*sta;
int len;
static void mem(void* _arr,size_t _range){
char* iter=(char*)_arr;
while(_range-->0)*iter++=0;
}
public:
explicit game(const int& size):mark(new bool[size]),team(new int[size]),sta(new int[size]),len(size){
mem(mark,size),mem(team,size),mem(sta,size);
}
~game(){
delete[] mark;
delete[] team;
delete[] sta;
}
void play(const int& ta,const int& tb){
mark[ta]=(team[ta]>team[tb]);
mark[tb]=not mark[ta];
}
void next(){
len/=2;
int* temp=new int[len];
for(int i=0,j=0;i<len*2;i++)if(mark[i])temp[j]=team[i],j++;
delete[] team;
team=temp;
delete[] mark;
mark=new bool[len];
mem(mark,len);
}
int& operator[](const size_t& index){
return team[index];
}
int get_len()const{return len;}
int* get_sta(){return sta;}
};
int tn(int _exp){
int ans=1;
for(int i=0;i<_exp;i++)ans*=2;
return ans;
}
int e;
int main(){
cin>>e;
game G(tn(e));
for(int i=0;i<tn(e);i++)cin>>G[i],G.get_sta()[i]=G[i];
while(G.get_len()!=2){
for(int i=0;i<G.get_len()/2;i++)G.play(2*i,2*i+1);
G.next();
}
for(int i=0;i<tn(e);i++)
if(G[0]==G.get_sta()[i]){
cout<<i+1;
break;
}
return 0;
}//9/8 k_byte