4 条题解

  • 1
    @ 2022-12-15 21:17:37

    淘汰赛

    没有复杂的pair版

    #include<bits/stdc++.h>
    using namespace std;
    int n,a[200],xx[200],z=1;//用xx[i]记录谁赢了第i队
    int arcaea(int l,int r,int c)
    {
    	if(c==0)//初始化树的最底层 c==0时l-r区间内只有一队
    	{
    		xx[l]=l;
    		return a[l];
    	}
    	int mid=(l+r)/2;
    	int lans=arcaea(l,mid,c-1);
    	int rans=arcaea(mid+1,r,c-1);
    	if(c==n)
    		if(lans<rans)
    			return xx[l];
    		else
    			return xx[r];
    	if(lans<rans)
    	{
    		xx[l]=xx[r];
    		return rans;
    	}
    	else
    	{
    		xx[r]=xx[l];
    		return lans;
    	}
    }
    int main()
    {
    	cin>>n;
    	int aa=n;
    	while(aa--)
    		z*=2;//z 总共队数
    	for(int i=1;i<=z;i++)
    		cin>>a[i];
    	cout<<arcaea(1,z,n);
    	return 0;
    }
    
    • 1
      @ 2022-12-9 18:11:45

      淘汰赛

      #include<bits/stdc++.h>
      using namespace std;
      const int MAXN = (1<<7);
      int n,len;//len==2^n
      int a[MAXN+5];
      //返回 l 开始的,2^level 个人比赛的前两名的编号 
      pair<int,int> f(int l,int level)
      {
      	//如果当前比赛只有一个人,返回这个人的编号 
      	if(level==0)
      		return make_pair(l,0);//第一名是 l,第二名没有 
      	//先把左右两个分赛进行完 
      	int nxtLen = (1<<(level-1));//分赛人数 
      	pair<int,int> left = f(l,level-1); // 左边分赛结果 
      	pair<int,int> right = f(l+nxtLen,level-1); //右边分赛的结果
      	//用两边分赛的第一名,进行比赛 
      	pair<int,int> now = make_pair(left.first,right.first);
      	if(a[now.second]>a[now.first])
      		swap(now.first,now.second);
      	//返回比赛结果 
      	return now;
      }
      int main()
      {
      	cin>>n;
      	len=(1<<n);
      	for(int i=1;i<=len;i++)
      		cin>>a[i];
      	pair<int,int> final = f(1,n);
      	cout<<final.second;
      	return 0;
      }
      
      • 0
        @ 2022-12-17 16:34:28

        对称二叉树

        #include <bits/stdc++.h>
        using namespace std;
        int n;
        int v[1000001];
        int l[1000001];
        int r[1000001];
        int cnt[1000001];
        // 计算x这棵树的所有子树的大小,并返回这棵树的大小
        int dfs(int x)
        {
            // 边界
            if (l[x] == -1 && r[x] == -1)
            {
                cnt[x] = 1;
                return cnt[x];
            }
            // 递归
            cnt[x] = 1;
            if (l[x] != -1)
            {
                cnt[x] += dfs(l[x]);
            }
            if (r[x] != -1)
            {
                cnt[x] += dfs(r[x]);
            }
            return cnt[x];
        }
        
        bool check(int p, int q)
        {
            if (p == -1 && q == -1)
                return true;
            if (p != -1 && q != -1 && v[p] == v[q])
            {
                bool b1 = check(l[p], r[q]);
                bool b2 = check(r[p], l[q]);
                return b1 && b2;
            }
            return false;
        }
        
        int main()
        {
            cin >> n;
            for (int i = 1; i <= n; i++)
            {
                cin >> v[i];
            }
            for (int i = 1; i <= n; i++)
            {
                cin >> l[i] >> r[i];
            }
            // 计算每个子树的大小
            dfs(1);
            int ans = 0;
            // 检验每一个子树
            for (int i = 1; i <= n; i++)
                // 如果是一个对称二叉树
                if (check(l[i], r[i]) == true)
                    //  如果比最大的更大
                    if (cnt[i] > ans)
                        // 最大的设置为这个
                        ans = cnt[i];
            // 输出 最大的大小
            cout << ans << endl;
            return 0;
        }
        
        • 0
          @ 2022-12-8 21:05:13

          图的遍历

          60分

          #include<bits/stdc++.h>
          using namespace std; 
          //邻接矩阵-有向无权图 
          int n,m; 
          bool g[1005][1005]; 
          int vis[1005]; 
          int dfs(int x,int u){
          	int maxX=x;
          	//枚举所有点 
          	for(int i=1;i<=n;i++){
          		//如果能走到并且没走过 
          		if(g[x][i]&&vis[i]!=u){
          			//走一下 
          			vis[i]=u;
          			maxX=max(maxX,dfs(i,u));  
          		}
          	}
          	return maxX;	 
          }
          int main(){
          	cin>>n>>m;
          	memset(g,false,sizeof(g)); 
          	for(int i=1;i<=m;i++){
          		int u,v;
          		cin>>u>>v;
          		g[u][v]=true;
          	} 
          	memset(vis,0,sizeof(vis));
          	for(int i=1;i<=n;i++){
          		cout<<dfs(i,i)<<" ";
          	}
          	return 0;
          }
          

          满分

          #include <bits/stdc++.h>
          using namespace std;
          int n, m;
          vector<int> e[100005];
          int A[100005];
          void dfs(int u, int d)
          {
              if (A[u] != -1)
                  return;
              A[u] = max(d, A[u]);
              //枚举u能连接到的点
              for (int i = 0; i < e[u].size(); i++)
              {
                  int v = e[u][i];
                  dfs(v, d);
              }
          }
          int main()
          {
              cin >> n >> m;
              for (int i = 1; i <= n; i++)
                  e[i].clear();
              for (int i = 1; i <= m; i++)
              {
                  int u, v;
                  cin >> u >> v;
                  e[v].push_back(u);
              }
              memset(A, -1, sizeof(A));
              for (int i = n; i >= 1; i--)
                  dfs(i, i);
              for (int i = 1; i <= n; i++)
                  cout << A[i] << " ";
              return 0;
          }
          
          • 1

          信息

          ID
          1191
          时间
          1000ms
          内存
          256MiB
          难度
          1
          标签
          递交数
          28
          已通过
          27
          上传者