UVA140-Bandwidth(回溯法-双剪枝)

EFR32BG22 Thunderboard开发板 使用SPI 读取加速度计 Simplicity Studio v5 创建Silicon Labs蓝牙SoC EFR32BG22 Thunderboard模块的加速度计工程,模块上有一个ICM-20648 6轴运动跟踪设备,集成3轴加速度计和3轴陀螺仪功能,使用SPI接口跟EFR32BG22芯片连接。 我尽量以图片的形式展示(少打字): 将EFR32BG22的Thunderboard模块通过USB线插入到电脑,打开Simplicity Studio v5软件。 下面看重点: 点击搜索到的IO Stream: USART,点击Ins 阅读详情

经典的回溯做法,紫书上196-197
剪枝:1,最优性剪枝:目前的结果已经比已知的最优解还差时,剪枝。
2,最理想化剪枝:从当前结果出发,后面的情况都是最理想的(预测),但是都比已知的最优解还差,剪枝。
本题要注意的是一直WA的原因是题目所给的字母不一定是相邻的,所以字母范围不是A-H
,有可能是A和Z两个字母 ,所以要映射或者压缩。
补充说明:代码是AC的。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<cstring>
#include<string>
#include<cmath>

using namespace std;

typedef long long LL;

#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define pii pair<int,int>
#define all(x) x.begin(),x.end()
#define mem(a,b) memset(a,b,sizeof(a))
#define per(i,a,b) for(int i = a;i <= b;++i)
#define rep(i,a,b) for(int i = a;i >= b;--i)
const int maxn = 10;
int n = 0,m = 0; 
//string str;
char str[1000];
//vector<int> vt[maxn];
int s[maxn+10],sy[maxn+10];
int mp[maxn+2][maxn+2];
int ans = 20;
bool vis[maxn+10];
int id[30],back[maxn+10];//id的内存要够 
void dfs(int cur,int bw){
	if(cur == n){
		//if(bw != 0 && bw < ans){//多余的判断,能进入到这一层,一定会满足这些条件(能进行下一层地柜的条件) 
		memcpy(sy,s,sizeof(s));
		ans = bw; 
		//}
		return ;
	}
	
	for(int i = 0;i < n;++i){
		if(vis[i]){
			continue;
		}
		int tmp = bw;//bw也要在不同的选择还原 
		s[cur] = i;
		int mi = 0;
		per(j,0,cur-1){
			if(mp[i][s[j]] == 1 || mp[s[j]][i] == 1){
				tmp = max(bw,cur-j);
				break;
			}
		}
		//最理想化剪枝
		per(j,0,n-1){
			if(mp[i][j] == 1 && !vis[j]){
				++mi;
			}
		}
		
		if(mi >= ans){
			continue;
		}
		
		if(tmp < ans){//最优性剪枝 
			vis[i] = true;
			dfs(cur+1,tmp);
			vis[i] = false;
		} 
		//bw = tmp;//同一层的选择之间互不影响 
	}
}
int main(){
	//std::ios::sync_with_stdio(false);
	while(~scanf("%s",str) && str[0] != '#'){
		memset(vis,false,sizeof(vis));
		memset(mp,0,sizeof(mp));
		ans = 20;
		set<int> st;
		//if(strcmp(str,"#") == 0){
		//	break;
		//}
		int size = strlen(str);
		per(j,0,size-1){
			if(isalpha(str[j])){
				st.insert(str[j] - 'A');
			}
		}
		int cnt = 0;
		set<int>::iterator it = st.begin();
		for(it = it;it != st.end();++it){//映射,一直WA的原因是题目所给的字母不一定是相邻的,所以字母范围不是A-H
		//有可能是A和Z两个字母 
			id[*it] = cnt;//压缩,减少mp的空间 
			back[cnt++] = *it;//还原答案 
		} 
		int i = 0;
		while(i < size){
			int node = str[i] - 'A';
			i += 2;
			while(i < size && str[i] != ';'){
				mp[id[str[i] - 'A']][id[node]] = 1;
				mp[id[node]][id[str[i] - 'A']] = 1;
				++i;
			}
			++i;
		}
	
		n = st.size();
		dfs(0,0);
		per(j,0,n-1){
			printf("%c ",'A' + back[sy[j]]);
		}
		printf("-> %d\n",ans);
	}
	
	return 0;
}

【2025华为OD机考真题】- 简易内存池(B卷-200分)(C版) 🔔本文收录于「最新最全华为OD机试真题(C版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!专栏所写题库均精心搜集于互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验所撰,欢迎订阅。    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新皆可阅 阅读详情

相关推荐

别再为CAD和GIS数据对不上而头疼了!一份完整的ArcGIS for AutoCAD坐标系定义与数据套合指南

本文详细介绍了如何通过ArcGIS for AutoCAD插件解决CAD与GIS数据坐标系不匹配的问题,实现数据的精准套合。文章从坐标系冲突分析、插件核心功能解析到五步标准化工作流,提供了完整的解决方案,帮助工程师和设计师提升跨平台协作效率。

weixin_42531886的博客 217

UVA-140-Bandwidth-最优性剪枝与回溯

UVA-140-Bandwidth参考题解,参考算法为回溯与剪枝,本文简要介绍在回溯中如何进行最优性剪枝。

我是懒狗━┳━ ━┳━ 546

Bootloader详解,理解Bootloader看这篇就够了

这里写目录标题一、Bootloader作用(目的)二、完成Boot最终目的的前提条件三、对前提条件的详细说明3.1、对前提条件(1)的说明:3.2、对前提条件(2)的说明:3.3、对前提条件(3)的说明:3.4、对前提条件(4)的说明:3.4、对前提条件(5)的说明:四、loader是干啥的 一、Bootloader作用(目的) Bootloader=Boot + loader Boot的目的: 最终目的:跳到C语言中;为了C语言运行程序会进行一系列的初始化,系统一上电后如何通过一系列的设置让软件程序员

iduuigdg的博客 11万+

【UVA140】Bandwidth(最优性剪枝+全排列+思路)

题目:https://vjudge.net/problem/UVA-140 解题思路: 1.全排列:使用库函数next_permutation(a,a+n) 2.最优性剪枝:如果目前已经找到的最小带宽是k,若在新的一组排列中,发现已经有两个结点的距离大于或等于k,应强制把它“剪”掉,即剪枝。 3.全排列时肯定要对输入中出现的字母所对应的int数组做全排列,所以要对出现的字母做标记! (1...

Cassie_zkq的博客 715

致远OA公文管理模块相关操作

致远oa协同办公系统 公文管理模板 相关操作

weixin_59666050的博客 4278

Vitis HLS 学习指南与实践教程

Vitis HLS 学习指南与实践教程摘要:本文系统介绍了AMD Vitis HLS工具及其应用。HLS技术将C/C++代码自动转换为硬件描述语言,显著提升FPGA开发效率(5-10倍)。文章对比了HLS与传统RTL设计的优势,包括抽象级别高、开发周期短、代码重用性强等特点。详细讲解了Vitis HLS工具链的核心功能,包括支持的C/C++特性(如任意精度数据类型)、开发流程(项目创建-代码编写-仿真-综合)以及关键优化技术(流水线、循环展开、数组分割等编译指示)。通过具体代码示例展示了HLS设计方法,为F

weixin_44707118的博客 1401

UVA - 140(Bandwidth )(全排列+暴力)

题意: 给出一个n(n<=8)个节点的图G和一个节点的排列,定义节点i的带宽为相邻接点在排列中的最远距离。 分析:用全排列暴力做,先找出给出的序列中的所有字母,我用的set存贮(可以去掉重复的字母),这就是需要进行全排列的字符串,在每一个排列里找到带宽,然后输出其中的最小值即可。做的时候总感觉没思路,其实就是自己傻,有时候不愿意深入地去想一个题,总是看完这个题感觉不会就去看另一个题,到头来那个题

zfldongcidaci的博客 485

CubeMX配置ADC+DMA避坑实战:如何避免采样过快导致的系统崩溃

本文针对STM32开发中常见的ADC采样过快导致程序卡死问题,提供了基于CubeMX的实战避坑指南。通过分析ADC与DMA协作机制,详解时钟配置、采样时间、DMA缓冲区长度及中断设置等关键步骤,帮助开发者从源头规避系统崩溃风险,实现稳定可靠的数据采集。

weixin_28273593的博客 324

UVa140 Bandwidth(带宽)

回溯法的应用+剪枝:Uva140-带宽

明朗晨光的专栏 359

rk3588s-摄像头适配gc8034

若还打开失败,需要看下XML中文件配置是否与DTS配置信息一致,或者XML参数配置是否有异常;MIPI摄像头是有上电时序要求,具体时序要查看sensor芯片对应的datasheet进行修改,如果时序不满足,sensor无法正常,此时用i2ctool去查看设备可能无法扫面到设备,即是i2c设备找不到。RK3588或者RK3588S有路MIPI-PHY,驱动开发工程师需要根据对应的硬件原图进行配置,以下会讲解分别使用MIPI-DPHY和MIPI-D/CPHY如何在DTS配置mipi摄像头的回环链路。

Yxx8066的博客 2201

保姆级教程:用Python+Mediapipe实时捕捉手势,驱动Unity虚拟手模型(附完整源码)

本文详细介绍了如何利用Python的Mediapipe库和Unity实现实时手势识别与虚拟手模型驱动。通过OpenCV进行图像采集,Mediapipe提供21个手部关键点识别,结合UDP通信协议实现Python与Unity之间的低延迟数据传输。教程包含完整源码、环境配置、核心代码实现及性能优化技巧,适用于VR教育、游戏开发等需要自然交互的场景。

weixin_42531779的博客 362

【刷题记录】 UVA140 宽带

题意:题目给你每个节点和它所之间连接的对象,距离为1.给出所有节点的排列,求每个排列所有可直接连接的节点间距离的最大值中 的最小值。

这里是阿安的博客 377

爆破shadow文件密码脚本(完成版)

由于添加了一个for循环,再稍作修改,让password not found!print(f"Trying password:")显示爆破的密码和过程。将代码中的password="123456"替换成下面代码。line.strip()函数首尾去空格。

m0_56578216的博客 772

Uva 140 Bandwidth(回溯法+剪枝)

书附的代码只有使用next_permutation()逐个计算带宽的,而网上没看到很符合心意的(回溯法+剪枝)的题解,自己写了个自我感觉逻辑比较清晰的,水准有限。(书附git链接:https://github.com/aoapc-book/aoapc-bac2nd/blob/master/ch7/UVa140.cpp)题意:    输入一行数据,其中有n个字符节点和节点间的连通关系,输出一组排列,...

r1041953637的博客 1623

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

UVa 140 - Bandwidth

传送门UVa 140 - Bandwidth 题意是让我们找出在

一只冰熊 1017

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

UVA140-Bandwidth(搜索剪枝)

ProblemUVA140-Bandwidth Time Limit: 3000 mSec Problem Description Given a graph (V, E) where V is a set of nodes and E is a set of arcs in V ×V , and an ordering on the elements in V , the...

weixin_30567471的博客 226

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

uva 140 bandwidth

我写成这样不忍直视。。。 大概是自己实现了我的第一个回溯法 #include #include #include using namespace std; int link[30][30]; int node[30]; int vis[30],sum,mutation[30],ans[30]; char a[1000],x,y; long long minn,maxn; int mark=0;

sfzyk的博客 317

例题 7-6 带宽(Bandwidth,UVa 140)

原题链接:https://vjudge.net/problem/UVA-140 分类:回溯法 备注:最优剪枝 在排序的过程中判断目前的最大带宽,如果大于已记录的带宽则回溯,只有排序一轮完成后再判断目前的宽带和已经记录的带宽,若更小则更新排序数组和带宽值,否则直接返回。 此外根据紫书思路,还能利用u节点有m个相邻节点没有确定位置,则若m>k也可回溯。如果加上这一剪枝,运行能从30-40(ms)直接变为0(ms)。 代码如下: #include<cstdio> #include<io

TK_wang_的博客 593

回溯法 UVa140 Bandwidth

给出一个图,找出其中的最小带宽的排列。具体要求见传送门:UVa140 这题有些小技巧可以简化代码的编写。 本题的实现参考了刘汝佳老师的源码,的确给了我许多启发,感谢刘老师。 思路: 建立双射关系:从字符A到字符Z遍历输入的字符串,用strchr函数将输入中出现的字符找出,并将找出的字符进行编号,用letter和id分别存储字符和对应的编号 降维:输入中给出的,是类似于邻接表形式的二维形式...

qq_37329281的博客 220

带宽(Bandwidth,UVa 140

本题用回溯法,将已经排列好的节点放在数组a中,并且记录下此时数组a的带宽值,这里的带宽值是作为函数参数传递的,即now_bandwith 如果a中的节点数等于输入的节点数,则此时为一个全排列,如果这个排列的带宽值比已经保存的最小带宽值小,那么保存该排列和带宽值即可。 为了优化代码,这里用到了剪枝的方法,当a中的排列的带宽值已经大于当前保存的最小带宽时,就没必要继续往a中加入元素了,也就不继续递

qq_25974431的博客 720

例题7-6 UVa140 Bandwidth(枚举+剪枝)

题意: 看白书 要点: 就是全排列问题加上一些剪枝,输入存储有些麻烦。注意如果有多个最小的排列,输出字典序最小的那个 #include <iostream> #include <algorithm> #include <cstring> #include <cstdlib> #include <cstdio...

weixin_34150503的博客 72

入门经典_Chap07_题解总结:枚举, 回溯, 状态空间搜索, IDA*

总结 枚举:注意枚举的对象和规模. 对象主要有排列, 子集, 状态, 转移等; 规模在原则上是要尽量缩小的,为此有时可能需要分类枚举. 回溯:剪枝是灵魂, 同时注意避免不必要的判断. 状态空间搜索: 一道八数码问题说明一切 => 点此转到八数码http://blog.youkuaiyun.com/a27038/article/details/75645835 迭代加深(ID)或(IDA*)

duaduac.com 519

枚举特训:带宽(UVA140)双映射,全排列枚举

解题思路:针对每一个字母,可以定义两个数组使其与连续的整数形成相互映射。接着定义两个vector,根据输入的连接形成一一对应关系,即同一个下标i,vector a[i]与b[i]相连。接着枚举排列,遍历vector得到每一个排列的带宽,并更新最小总带宽。 技巧学习: 1.双映射的巧妙应用,每一个字母用整数与之对应(我们并不需要直到每个字母具体对应哪一个整数) 2.使用双数组形成一一对应关系,...

mavises的博客 220

uva 140

题目地址 这题就是求一个全排列,判断最小的最大带宽。加上剪枝优化让程序更快速,当前已经有一个最小值的时候,若此时结果的到了一个更大的带宽,就不用处理了。 这题输入处理和带宽计算要弄清楚: 输入处理,直接用二维标记a和b是否相邻。 这里e是存下出现的字母(后面有去重处理,也可以直接set),mp是标记两个字母是否能够到达。 char ch; int t = 1; mi = INF; for(int i=0;i<(int)s.size();i++) { if(s[i] == ':')

qq_45604735的博客 237

UVa140

/* 因为最多有8个点,因此暴力搜索即可,最多时间复杂度8! 1.按照提议处理数据,首先是读取字符串,处理边关系e[i][j]和标记使用的节点v[i] 2.对于每一种排列,计算每个元素的位置pos[i],方便后面计算每个节点的带宽bd[i] 3.更新结果带宽和对应的排序。 */#include #include #include #include #include #incl

我爱coding的专栏 402

UVa 140 带宽(Bandwidth)

给出一个最多为8个节点的图,定义节点i的带宽为i和相邻节点在将要输出排列中的最大距离,而所有节点的最大距离的最大值为这个图的带宽面求一个最少带宽的节点的排列,如果多个,输出字典序最小的排列。 搜索与回溯。 剪枝,否则可能超时。 代码易懂但有点长。 #include<bits/stdc++.h> #define LL long long #define INF 0x7fffffff us...

Inuyasha__的博客 370
上一篇: CF538div2-C-Trailing Loves (or L'oeufs?)-数论
下一篇: 最大连续和-高效算法
Mavis code
博客等级 码龄9年 13粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值