20分,求助

P4715 【深基16.例1】淘汰赛

现在能拿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


|