因为树不太会,数据也不大,所以干脆稳打暴力。~~本来想写链表的~~
答题思路就是一列数,然后两两比较,每次都筛除一半的队伍,最后决赛输出被打败的(亚军)
by S_ALPHA @ 2023-11-10 17:15:15
我是他同学,看他两天没调出来,用树做了一个,用他的思路做了一个
附代码如下:
他的神奇小思路(模拟):
```cpp
#include<bits/stdc++.h>
using namespace std;
int n;
int a[10000];
int p,kk,tt;
int main(){
cin>>n;
for(int i=1;i<=pow(2,n);i++){
cin>>a[i];
}
for(int i=1;i<=n-1;i++){
p=1;
for(int j=1;j<=pow(2,n);j++){
if(p==1&&a[j]!=0){
kk=a[j];
tt=j;
p=0;
}
else if(p==0&&a[j]!=0){
if(a[j]>kk){
a[tt]=0;
}
else{
a[j]=0;
}
p++;
}
}
}
p=0;
for(int i=1;i<=pow(2,n);i++){
if(a[i]!=0&&p==0){
kk=a[i];
tt=i;
p=1;
}
else if(a[i]!=0&&p==1){
if(a[i]>kk){
cout<<tt;
}
else{
cout<<i;
}
}
}
return 0;
}
```
-----------------------------
-----------------------------
树(做的不太好,输出有bug,但是数据很水,所以AC了)
```cpp
#include<bits/stdc++.h>
using namespace std;
const int N=1024;
int n;
int f[N],a[N];
int solve(int n){
if(f[n]>0){
return f[n];
}
f[n]=max(solve(2*n),solve(2*n+1));
return f[n];
}
int main(){
cin>>n;
int kk=pow(2,n);
for(int i=0;i<kk;i++){
cin>>f[kk+i];
a[i+1]=f[kk+i];
}
solve(1);
int mm=min(f[2],f[3]);
for(int i=1;i<=kk;i++){
if(a[i]==mm){
cout<<i;
return 0;
}
}
return 0;
}
```
-----------------------------
-----------------------------
我跟他说了,他不听,那希望各位大佬来帮帮他了:D
by queenbee @ 2023-11-10 17:31:17
其实是在11行上面加一条
```cpp
if(!lb[i].pw)continue;
```
因为如果没有continue,flag就会一直更新,导致指向的位置错误,然后就“筛”不动了。
自此结帖
by S_ALPHA @ 2023-11-22 17:22:20