3 条题解

  • 7
    @ 2024-7-14 22:29:51

    题目:P4715

    提交记录:R114724385

    思路:

    首先创建一个结构体 BYX 表示国家,包含两个整型变量:

    • id:国家的编号;
    • pow:power,国家的能力值。
    struct BYX{
    	int id;
    	int pow;
    };
    

    建立一个队列 queue <BYX> q; 用于存储国家。

    每次比较队首两个元素,将其中能力值较大的入队。

    while(q.size()>1){
    		a=q.front();
    		q.pop();
    		b=q.front();
    		q.pop();
    		q.push(max(a,b,cmp));
    		
    	}
    

    但要注意,题目要求的是亚军(第二名),所以循环结束后不应输出 qq 的队首元素。

    因为循环中 a,ba,b 起到缓存当前遍历的两个国家的作用,所以 a,ba,b 中现在存储的是冠军和亚军,那么应该输出 a,ba,b 中的较小值。

    我们可以看到,代码中调用了对于 BYX 结构体的排序,如果直接编译会报错。

    这是因为 BYX 结构体是我们自定义的,C++ 标准库中并无 BYX 结构体,也就没有对于 BYX 结构体的排序算法。

    所以我们需要自己写对于 BYX 结构体的排序算法吗?

    并不是。

    在这里,向大家介绍:

    cmp 函数!

    这是一个返回值为 bool 类型的函数,它的作用是返回两个参数中的较小值。

    那么我们只需要在主函数前加入对于 BYX 结构体的 cmp 函数:

    bool cmp (BYX n,BYX m){
    	return n.pow<m.pow;
    }
    

    然后代码(主体部分)就大功告成了!

    代码实现

    #include<iostream>
    #include<algorithm>
    #include<queue>
    using namespace std;
    int n;
    struct BYX{
    	int id;
    	int pow;
    }a,b;
    bool cmp (BYX n,BYX m){
    	return n.pow<m.pow;
    }
    queue <BYX> q;
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<=(1<<n);i++){
    		scanf("%d",&a.pow);
    		a.id=i;
    		q.push(a);
    	}
    	while(q.size()>1){
    		a=q.front();
    		q.pop();
    		b=q.front();
    		q.pop();
    		q.push(max(a,b,cmp));
    		
    	}
    	printf("%d",min(a,b,cmp).id);
        return 0;
    }
    

    记得给五星好评哦喵~ 谢谢客官啦~

    • 1
      @ 2024-10-5 14:39:35
      #include<bits/stdc++.h>
      using namespace std;
      int n;
      int value[1<<8];
      int winner[1<<8];
      void dfs(int x){
      	if(x>=(1<<n))return;
      	dfs(2*x);
      	dfs(2*x+1);
      	int lvalue=value[2*x];
      	int rvalue=value[2*x+1];
      	if(lvalue>rvalue){
      		value[x]=lvalue;
      		winner[x]=winner[2*x];
      	}else{
      		value[x]=rvalue;
      		winner[x]=winner[2*x+1];
      	}
      }
      int main(){
      	cin>>n;
      	for(int i=0;i<(1<<n);i++){
      		cin>>value[(1<<n)+i];
      		winner[(1<<n)+i]=i+1;
      	}
      	dfs(1);
      	int num=(value[2]>value[3]?winner[3]:winner[2]);
      	cout<<num;
      	return 0;
      }
      • 0
        @ 2024-10-5 14:05:29

        #include<bits/stdc++.h> using namespace std; int n; struct BYX{ int id; int pow; }a,b; bool cmp (BYX n,BYX m){ return n.pow<m.pow; } queue q; int main(){ scanf("%d",&n); for(int i=1;i<=(1<<n);i++){ scanf("%d",&a.pow); a.id=i; q.push(a); } while(q.size()>1){ a=q.front(); q.pop(); b=q.front(); q.pop(); q.push(max(a,b,cmp));

        }
        printf("%d",min(a,b,cmp).id);
        return 0;
        

        }

        • 1

        信息

        ID
        2056
        时间
        1000ms
        内存
        125MiB
        难度
        4
        标签
        (无)
        递交数
        61
        已通过
        29
        上传者