现在能拿40分了
```cpp
include<iostream>
#include<cmath>
using namespace std;
int winner[290];
int n;
int value[390];
void dfs(int x)
{
if(x>=1<<n)
{
return ;
}
else
{
dfs(2*x);
dfs(2*x+1);
int a=value[2*x];
int b=value[2*x+1];
if(a>=b)
{
value[x]=a;
winner[x]=winner[2*x];
}
else
{
value[x]=b;
winner[x]=winner[2*x+1];
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=pow(2,n);i++)
{
cin>>value[(1<<n)+i];
winner[(1<<n)+i]=i;
}
dfs(1);
if(value[2]>value[3])
cout<<winner[2];
else
cout<<winner[3];
return 0;
}
by gyttnnd @ 2022-12-11 17:18:52
@[gyttnnd](/user/835944) 整体就有问题。
by Kevin_Mamba @ 2022-12-11 17:48:37
@[2124Kobe](/user/576934)
我对着深基写的,我只是从1
开始循环,但不知道为什么就是错的
by gyttnnd @ 2022-12-11 17:51:13
1. 最后输出
你搞反了,亚军应该是小的。
```
if(value[2]>value[3])
cout<<winner[3];
else
cout<<winner[2];
```
2. 输入和 dfs
```
if(x>=1<<n) return ;
```
这样的话,就**不会有** $x=2^{n+1}$ 的情况 。
而你的输入:
```
cin>>value[(1<<n)+i];
winner[(1<<n)+i]=i;
```
最后一个输入时,$x=(1<<n)+pow(2,n)=2^{n+1}$
所以,**不会考虑最后的参赛队伍** 。
正确:
```
cin>>value[(1<<n)+i-1];
winner[(1<<n)+i-1]=i;
```
3. 综上所述
```
#include<iostream>
#include<cmath>
using namespace std;
int winner[290];
int n;
int value[390];
void dfs(int x)
{
if(x>=1<<n)
{
return ;
}
else
{
dfs(2*x);
dfs(2*x+1);
int a=value[2*x];
int b=value[2*x+1];
if(a>=b)
{
value[x]=a;
winner[x]=winner[2*x];
}
else
{
value[x]=b;
winner[x]=winner[2*x+1];
}
}
// cout<<x<<" "<<winner[x]<<endl;
}
int main()
{
cin>>n;
for(int i=1;i<=pow(2,n);i++)
{
cin>>value[(1<<n)+i-1];
winner[(1<<n)+i-1]=i;
}
dfs(1);
if(value[2]>value[3])
cout<<winner[3];
else
cout<<winner[2];
return 0;
}
```
by Kevin_Mamba @ 2022-12-11 17:54:23
@[gyttnnd](/user/835944) 不能从 1 开始,见上。
by Kevin_Mamba @ 2022-12-11 17:56:10
其实也可以:
```
for(int i=0;i<pow(2,n);i++)
{
cin>>value[(1<<n)+i];
winner[(1<<n)+i]=i+1;
}
```
by Kevin_Mamba @ 2022-12-11 18:01:35
@[2124Kobe](/user/576934)
谢谢,给关注了
by gyttnnd @ 2022-12-11 18:09:25
@[gyttnnd](/user/835944) 加油!
by Kevin_Mamba @ 2022-12-11 19:07:08
想问一下,左移是啥,在这里有什么作用?(挺急的
by hjxz @ 2023-07-29 15:32:02