//TODO: Write code here int n,m; constint N=1e5+10; structNode { int num,val; }node[N]; signedmain() { cin>>n; int ans=0; int len=pow(2,n); for (int i=1;i<=len;i++){ cin>>node[i].val; node[i].num=i; } while (len!=1){ if (len==2){//直到最后还剩两个节点 if (node[1].val>=node[2].val){ ans=node[2].num; }else{ ans=node[1].num; } break; } for (int i=1,j=1;i<=len;i+=2,j++){ if (node[i].val>=node[i+1].val){ node[j]=node[i]; } else{ node[j]=node[i+1]; } } len>>=1; } cout<<ans; #define one 1 return0; }
//TODO: Write code here int n,m; constint N=5e2+10; int nums[N],dp[N][N]; voidfloyd(){ for (int k=1;k<=n;k++){ for (int i=1;i<=n;i++){ for (int j=1;j<=n;j++){ dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]); } } } } signedmain() { cin>>n; memset(dp,0x3f,sizeof(dp)); for (int i=1;i<=n;i++){ int b,c; cin>>nums[i]>>b>>c; //两点之间距离的初始化 dp[i][b]=dp[i][c]=dp[b][i]=dp[c][i]=1; dp[b][b]=dp[i][i]=dp[c][c]=0; } //计算两点之间的最短路径 floyd(); int ans=INF; for (int i=1;i<=n;i++){ int ones=0; //以顶点 i 为起点,到某一点的最小距离和 for (int j=1;j<=n;j++){ ones+=dp[i][j]*nums[j]; } ans=min(ans,ones); } cout<<ans; #define one 1 return0; }
//TODO: Write code here int n,m; constint N=1e2+10; int nums[N],dp[N][N]; signedmain() { cin>>n; int a,b; memset(dp,0x3f,sizeof(dp)); for (int i=1;i<=n-1;i++){ cin>>a>>b; dp[a][b]=1; //父亲到孩子的距离是1 dp[b][a]=2; //孩子到父亲的距离是2 dp[a][a]=dp[b][b]=0; } for (int k=1;k<=n;k++){ for (int i=1;i<=n;i++){ for (int j=1;j<=n;j++){ dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]); } } } int deep=0; //深度 for (int i=1;i<=n;i++){ deep=max(deep,dp[1][i]); } //宽度 int kuan[N]{}; int kuan_dis=0; for (int i=1;i<=n;i++){ ++kuan[dp[1][i]];//每一层到根节点的距离都是一样的 kuan_dis=max(kuan_dis,kuan[dp[1][i]]); } int u,v; cin>>u>>v; cout<<deep+1<<endl; cout<<kuan_dis<<endl; //uv之间的距离 cout<<dp[u][v]<<endl; #define one 1 return0; }