首页 > 其他分享 >L2-047 锦标赛

L2-047 锦标赛

时间:2024-03-29 17:15:49浏览次数:22  
标签:return 锦标赛 int win tree 胜利者 L2 047 ssize

这题没做出来,查了一些博客,下面是我比较能接受的一种写法。

读完题可以发现这是一个满二叉树,并且可以得到每场比赛失败者的信息(决赛是胜利者和失败者都可以得到)
对于一场比赛,它的胜利者要么是左孩子中的胜利者,要么是右孩子中的胜利者,那我们就可以先假设是左孩子的胜利者,如果不行就交换(是右孩子的胜利者),如果都不无法满足
条件,说明根本无解。
也就是说这个9可能是左边这个结点的win,也可能是右边的win,只要有一次试探成功就能返回true。

#include <bits/stdc++.h>
using namespace std;
const int N = 1 << 20;
struct node {
	int win;
	int lose;
}tree[N];
bool dfs(int n,int ssize) {
	if (n > ssize) return true;
	if (tree[n].win < tree[n].lose) {
		return false;
	}
	tree[2 * n].win = tree[n].win;//做出假设
	tree[2 * n + 1].win = tree[n].lose;
	if (dfs(2 * n, ssize) && dfs(2 * n + 1, ssize)) {
		return true;
	}
	swap(tree[2 * n].win, tree[2 * n + 1].win);
	if (dfs(2 * n, ssize) && dfs(2 * n + 1, ssize)) {
		return true;
	}
	return false;
}
int main() {
	int k;//层数
	cin >> k;
	for (int i = k; i >= 1; i--) {
		for (int j = 1 << (i - 1); j < 1 << i; j++) {
			cin >> tree[j].lose;
		}
	}
	//输入最后一轮的赢者
	cin >> tree[1].win;
	int ssize = (1 << k) - 1;
	int flag = 0;
	if (dfs(1,ssize)) {
		for (int j = 1 << (k - 1); j < 1 << k; j++) {
			if (flag == 0) {
				cout << tree[j].win << " " << tree[j].lose;
				flag = 1;
			}
			else {
				cout << " " << tree[j].win << " " << tree[j].lose;
			}
		}
	}
	else {
		cout << "No Solution" << '\n';
	}
	return 0;
}

标签:return,锦标赛,int,win,tree,胜利者,L2,047,ssize
From: https://www.cnblogs.com/chengyiyuki/p/18104207

相关文章

  • L2-025 分而治之(与L2-013 红色警戒 差不多一模一样)
    原题链接题目:分而治之,各个击破是兵家常用的策略之一。在战争中,我们希望首先攻下敌方的部分城市,使其剩余的城市变成孤立无援,然后再分头各个击破。为此参谋部提供了若干打击方案。本题就请你编写程序,判断每个方案的可行性。输入输出格式:输入在第一行给出两个正整数N......
  • L2-046 天梯赛的赛场安排
    和这道题真的有壁,拿起来就做,然后做错了。又看了半天题目,才知道大概啥意思。每一轮都需要给人数最多的学校分配位置,如果人数大于c,分配一个教室剩下的人还要再放回进行第二轮,而不是一次性给这个学校分配完。#include<bits/stdc++.h>usingnamespacestd;constintmaxn=5005......
  • 安装并配置fail2ban防止cc攻击
    通过下面命令安装fail2banyum-yinstallfail2ban启动systemctlstartfail2ban查看状态systemctlstatusfail2ban设置开机启动systemctlenablefail2ban检查版本fail2ban-client-Vfail2ban-sever-V检查配置文件是否有误fail2ban-client-d配置后需要重启服......
  • L2-044 大众情人
    测试点4一开始没过去,以为是数据范围的问题。找半天才发现是floyd三层循环k那个写反了,害。#include<bits/stdc++.h>usingnamespacestd;vector<int>male,female;intdis[510][510];intmain(){ memset(dis,0x3f,sizeof(dis)); intn; cin>>n; for(inti=1;i......
  • 逻辑链路控制与适配协议(L2CAP)
    逻辑链路控制与适配协议通常简称为L2CAP(LogicalLinkControlandAdaptationProtocol),它向上连接应用层,向下连接控制器层,发挥主机与控制器之间的适配器的作用,使上层应用操作无需关心控制器的数据处理细节。经典蓝牙的L2CAP层比较复杂,它实现了协议复用、数据分段与重组、封装......
  • L2-043 龙龙送外卖
    考察的是贪心+记忆化搜索。最短路=走过的路径*2-从根到小区最深路径长度#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1e5+10;intp[maxn],dis[maxn],dp[maxn];intmaxdepth=0,sumpath=0;intdfs(ints){//记忆化搜索 if(p[s]==-1)return0......
  • 团体程序设计天梯赛 L2-029 特立独行的幸福
    L2-029特立独行的幸福分数25对一个十进制数的各位数字做一次平方和,称作一次迭代。如果一个十进制数能通过若干次迭代得到1,就称该数为幸福数。1是一个幸福数。此外,例如19经过1次迭代得到82,2次迭代后得到68,3次迭代后得到100,最后得到1。则19就是幸福数。显然,在......
  • L2-028 秀恩爱分得快
    可恶的模拟,借鉴了别人的思路,这样写很清晰#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;constintN=1e5+10;constintinf=0x3f3f3f3f;constintmod=1e9+7;intn,q,m;vector<int>a,b;doubleg[1010][1010];doublemaxn[1010];set<......
  • PTA L2-033 简单计算器 手写栈
    本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器。如上图所示,计算器由两个堆栈组成,一个堆栈 S1​ 存放数字,另一个堆栈 S2​ 存放运算符。计算器的最下方有一个等号键,每次按下这个键,计算器就执行以下操作:从 S1​ 中弹出两个数字,顺序为 n1​ 和......
  • V4L2 ioctl调用流程分析
    学习资料:韦东山第三期 可参考:https://www.cnblogs.com/lethe1203/p/18097351video_device->.fops->v4l2_file_operations->.ioctl_ops->v4l2_ioctl_opsv4l2_ioctl_ops可分为两类:INFO_FL_STD:标准的,无需特殊的代码来处理,APP的调用可以直达这些处理函数I......