今天不想学习

【深基16.例1】淘汰赛 - 洛谷

根据队列知识,和巧用题目信息,代码都很简单哈哈哈,因为我会的不多

cpp 复制代码
#include<iostream>
#include<queue>
#include<map>
using namespace std;
#define int long long
int n,num=1;
signed main(){
	cin>>n;
	queue<int>q;map<int,int>mp;
	for(int i=1;i<=n;i++){
		num=num*2;
	}
	for(int i=1;i<=num;i++){
		int x ;cin>>x;
		q.push(x);
		mp[x]=i;
	}
	while(q.size()>=2){
		if(q.size()==2){
			int a,b;
			a=q.front();q.pop();
			b=q.front();q.pop();
			if(a>b)cout<<mp[b];
			else cout<<mp[a];
			return 0;
		}
		else {
			int a,b;
			a=q.front();q.pop();
			b=q.front();q.pop();
			if(a>b)q.push(a);
			else q.push(b);
		}
	}
	return 0;
}

但是又看到大佬的两个代码感觉又学到了

建立线段树模板

cpp 复制代码
ll arr[100010]={0},tree[500050]={0};  //arr为存储数据的数组,tree是存线段树的数组
void build(int node,int start,int end){   //建树函数,参数是根节点和左右区间 
	if(start==end){		//如果两边相等 
		tree[node]=arr[start]; //填的就是数组里的初始值 
		return;  //递归边界 
	}
	int leftnode=node*2;  //算出左右节点(完全二叉树的性质) 
	int rightnode=node*2+1;  
	int mid=(start+end)/2;    //把数组从中间劈成两半
	build(leftnode,start,mid);  //左边右边分开建树 
	build(rightnode,mid+1,end);
	tree[node]=tree[leftnode]+tree[rightnode]; //根节点的值=左根+右根 
} 

ac代码

cpp 复制代码
#include<iostream>
#include<cstring>
#include<algorithm> //比赛的时候闲的没事打了一堆头文件
#include<cmath>
#include<iomanip> 
using namespace std;
struct jiegouti{  //真·结构体
 	int power,id;  //power------能力值,id------国家序号
}; 
jiegouti maxt(jiegouti a,jiegouti b){  //返回两个结构体里能力值更大的那个
	return a.power>b.power?a:b;
}
jiegouti mint(jiegouti a,jiegouti b){ //返回两个结构体里能力值更大的那个
	return a.power<b.power?a:b;
}
jiegouti a[150],tree[600];  //a------数据,tree------线段树(一般为了防爆,线段树都是开数组的4倍空间)
void build(int node,int start,int end){ //建树函数
	if(start==end){  //叶节点,返回
		tree[node]=a[start];
		return;
	}
	int lnode=node*2;  //左右子树、中点
	int rnode=node*2+1;
	int mid=(start+end)/2;
	build(lnode,start,mid);  //两边递归建树
	build(rnode,mid+1,end);
	tree[node]=maxt(tree[lnode],tree[rnode])  //父节点是左右子节点里更大的;
}
int main(){
	int n;  //输入
	cin>>n;
	for(int i=1;i<=(1<<n);i++){  //1<<n就是2的n次方啦!(这样比pow函数更快哦!)
		cin>>a[i].power;  //输入,赋值,很简单
		a[i].id=i;	
	}
	build(1,1,(1<<n)); //建树(根节点是1,整棵树从1到2的n次方)
	cout<<mint(tree[2],tree[3]).id; //从tree[2],tree[3]里找个小的就是亚军,输出它的序号
	return 0;
}

和我差不多的思路的大佬ac代码

但是多了一个make_pair(int x,int b);前面还有一个queue<>,很值得学习一下,捆绑诱惑

cpp 复制代码
#include<iostream>
#include<queue>
#include<map>
using namespace std;
int main(){
	int n;
	queue<pair<int,int> > q;	//pair是stl中的数据结构,这里用first表示国家号,second表示国家实力 
	cin>>n;
	n=1<<n;				//位运算,等价与n=pow(2,n)(位运算更快)
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		q.push(make_pair(i,x));	//make_pair(i,x)就是建立一个first为i,second为x的pair 
	}
	while(q.size()>2){		//循环将比赛进行至只剩前两名(q.size()为2是时要跳出循环单独判断亚军) 
		pair<int,int> x,y;
		x=q.front();
		q.pop();
		y=q.front();
		q.pop();
		if(x.second>y.second){	//从队头取出两个队,进行比较后将较强的队压入队尾 
			q.push(x);
		}else{
			q.push(y);
		}
	}
	pair<int,int> x,y;
	x=q.front();
	q.pop();
	y=q.front();
	q.pop();
	if(x.second>y.second){		//较弱的那队时亚军,将其国家号输出 
		cout<<y.first<<endl;
	}else{
		cout<<x.first<<endl;
	}
	return 0;
}
相关推荐
IT猿手8 分钟前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解GLSMOP1-GLSMOP9及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·算法·机器学习·matlab·强化学习
阿七想学习13 分钟前
数据结构《排序》
java·数据结构·学习·算法·排序算法
王老师青少年编程20 分钟前
gesp(二级)(12)洛谷:B3955:[GESP202403 二级] 小杨的日字矩阵
c++·算法·矩阵·gesp·csp·信奥赛
Kenneth風车1 小时前
【机器学习(九)】分类和回归任务-多层感知机(Multilayer Perceptron,MLP)算法-Sentosa_DSML社区版 (1)111
算法·机器学习·分类
eternal__day1 小时前
数据结构(哈希表(中)纯概念版)
java·数据结构·算法·哈希算法·推荐算法
APP 肖提莫1 小时前
MyBatis-Plus分页拦截器,源码的重构(重构total总数的计算逻辑)
java·前端·算法
OTWOL1 小时前
两道数组有关的OJ练习题
c语言·开发语言·数据结构·c++·算法
QQ同步助手2 小时前
C++ 指针进阶:动态内存与复杂应用
开发语言·c++
qq_433554542 小时前
C++ 面向对象编程:递增重载
开发语言·c++·算法
易码智能2 小时前
【EtherCATBasics】- KRTS C++示例精讲(2)
开发语言·c++·kithara·windows 实时套件·krts