UVA 658 It‘s not a Bug,it‘s a Feature(单源最短路,Dijkstra)

AIGC在游戏行业的应用:革新游戏开发与体验 AIGC(人工智能生成内容)技术正在深刻改变游戏行业,从开发到体验全面革新。在游戏开发中,AIGC可用于自动生成关卡、角色和剧情,提升开发效率;在资源制作中,通过AI生成场景、角色模型等,降低成本。 阅读详情

UVA 658 It’s not a Bug,it’s a Feature(单源最短路,Dijkstra)

有n(n<=20)个潜在bug和m(m<=100)个补丁,每个补丁用两个长度为n的字符串表示,分别代表该补丁的前置环境和安装补丁后的状态。

在第一个表示前置环境的字符串中,0代表该位对应的Bug可有可无,+表示必须有该Bug,-表示必须没有该Bug;在第二个表示安装补丁后的状态的字符串内,0代表该Bug不变,+表示增加了该位Bug,-表示修复了该位Bug。

之前在动态规划中有过用二进制表示集合的经验(状态压缩),对于有n(n<=20)个状态位,每个状态只有0和1两个状态,显然可以用一个二进制的整数来表示一个单独的状态。

这样来,补丁的前置环境可化为一个整数节点u,安装补丁之后的状态可化为一个整数节点v,那么一个补丁就可以形象的表示为多个E(u,v)的有向边。

问题转换成在一张有向有环无负权的图,求单源最短路径的问题。该问题典型的一个算法是Dijkstra。

如果在表示状态中用1表示该位Bug存在,0表示不存在,那么该源的标号为s=(1<<n)-1,答案为d[0]。

整张图的节点有2n个,然而许多的节点是根本无法到达的,如果直接建图的话会浪费时间和内存(因为包含了许多无用节点和无用边)。

可以采用的一个方法是,在Dijkstra,当从优先队列取出一个节点时,遍历补丁通过位运算的方法看有无可以延伸的边,如果有则延伸并将新节点加入队列。其余的步骤跟Dijkstra算法无差别。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int max_n=(1<<21);
const int INF=0x3f3f3f3f;
int n,m;
struct HeapNode{
	int d,u;
	HeapNode(int i,int j):d(i),u(j){}
	bool operator <(const HeapNode& p) const{
		return d>p.d;
	}
};
int d[max_n];
int bug[1005],no_bug[1005],w[1005];
int bug_1[1005],no_bug_1[1005]; 
bool check(int u,int i)
{
	return ((u&no_bug[i])==0)&&((u&bug[i])==bug[i]);
}
int e(int u,int i)
{
	return ((u|no_bug_1[i])^no_bug_1[i])|bug_1[i];
}
void Dijkstra(void)
{
	memset(d,0x3f,sizeof(d));
	int s=(1<<n)-1;
	d[s]=0;
	priority_queue<HeapNode> q;
	q.push(HeapNode(0,s));
	while(!q.empty())
	{
		HeapNode cur=q.top();q.pop();
		int u=cur.u;
		if(d[u]!=cur.d)continue;
		for(int i=0;i<m;i++)
		if(check(u,i))
		{
			int v=e(u,i);
			if(d[v]>d[u]+w[i]){
				d[v]=d[u]+w[i];
				q.push(HeapNode(d[v],v));
			}
		}
	}
}
int main(void)
{
//	freopen("in.txt","r",stdin);
//	freopen("out.txt","w",stdout);
	int cnt=1;
	while(~scanf("%d%d",&n,&m)&&n)
	{
		for(int i=0;i<m;i++)
		{
			string a,b;
			int c;
			cin>>c>>a>>b;
			int x=0,y=0;
			w[i]=c;
			for(int j=0;j<a.length();j++)
			{
				x=(x<<1)+(a[j]=='+'?1:0);
				y=(y<<1)+(a[j]=='-'?1:0);
			}
			bug[i]=x;no_bug[i]=y;
			x=y=0;
			for(int j=0;j<b.length();j++)
			{
				x=(x<<1)+(b[j]=='+'?1:0);
				y=(y<<1)+(b[j]=='-'?1:0);
			}
			bug_1[i]=x;no_bug_1[i]=y;
		}
		Dijkstra();
		printf("Product %d\n",cnt++);
		if(d[0]!=INF)printf("Fastest sequence takes %d seconds.\n",d[0]);
		else printf("Bugs cannot be fixed.\n");
		cout<<endl;
	}
//	fclose(stdin);
//	fclose(stdout);
}
//3 3
//1 000 00-
//1 00- 0-+
//2 0-- -++
//4 1
//7 0-0+ ----
//0 0

上述程序通过bug[]和no_bug[]数组来维护每个补丁前置环境的状态,通过bug_1[]和no_bug_1[]来维护用了该补丁后的状态。

YOLOv8 骨骼结构识别详细说明 YOLOv8骨骼结构识别是一种基于深度学习技术的医学影像分析方法,主要用于X光、CT等影像中的骨骼定位与识别。该系统具有多骨骼同步识别能力,可应用于手部、脊柱、骨盆等不同部位,并能精确定位骨骼关键点。技术实现包括数据预处理、模型训练、推理检测、关键点分析和批量处理五个核心模块,支持骨折检测、骨龄评估等临床应用。该系统需注意医学合规性,要求高质量标注数据,并针对骨骼影像特点进行特征工程优化,同时考虑不同设备的部署需求。 阅读详情

相关推荐

从零搭建YOLOv2硬件加速器:基于PYNQ-Z2的Vivado HLS与Jupyter Notebook实战

本文详细介绍了如何从零搭建YOLOv2硬件加速器,基于PYNQ-Z2开发板,结合Vivado HLS与Jupyter Notebook实现高效目标检测。通过硬件加速,YOLOv2推理速度提升8倍,功耗降低80%。文章涵盖硬件准备、Vivado HLS工程配置、IP核集成、PYNQ部署及常见问题解决,为开发者提供完整实战指南。

weixin_29188997的博客 1008

uva_658_It's not a Bug, it's a Feature!(最短路)

题意:补丁在修补bug时,有时候会引入新的bug。假定有n(n<=20)个潜在bug和m(m<=100)个补丁,每个补丁用两个长度为n的字符串表示,其中字符串的每个位置表示一个bug。第一个串表示打补丁前的状态(“-”表示该bug必须不存在,“+”表示必须存在,“0”表示无所谓),第二个串表示打补丁后的状态(“-”表示不存在,“+”表示存在,“0”表示不变)。每个补丁都有一个执行时间,你的任务是用最少的时间把一个所有bug都存在的软件通过打补丁的方式变得没有bug。一个补丁可以打多次。

一点也不二 1880

安装Quartus-II 13 和Modelsim

目录一、Quartus-II安装1.Quartus-II 13下载2.Quartus-II 13安装3.Quartus-II 13注册二、Modelsim安装 实验目的:安装Quartus-II 13 和Modelsim 实验环境:Windows10 参考资料:Quartus-II安装及使用 一、Quartus-II安装 1.Quartus-II 13下载 正点原子官方资料下载 百度网盘下载链接: https://pan.baidu.com/s/1a9d-bq9RZmWrRV542X4IEA 提取码:

qqq080的博客 8626

【UVA】658 - It's not a Bug, it's a Feature!(隐式图 + 位运算)

位运算处理很重要

花月阁 874

避开STM32中断优先级配置的坑:HAL_NVIC_SetPriority()参数你真的用对了吗?

本文深入解析STM32中断优先级配置中的关键问题,重点剖析HAL_NVIC_SetPriority()函数的正确使用方法。通过实际案例揭示优先级分组设置、抢占优先级与子优先级的区别,提供多中断系统中的优化策略和调试技巧,帮助开发者避免常见配置错误,提升系统稳定性。

weixin_42532938的博客 421

工程师必看:如何用MINITAB快速计算传感器寿命(附详细步骤)

本文为工程师提供了使用MINITAB软件快速计算传感器寿命的详细实战指南。文章重点阐述了如何通过数据预处理、回归分析拟合阿伦尼斯模型,并最终预测平均寿命与置信区间,帮助工程师高效处理加速寿命试验数据,提升可靠性分析工作的准确性与效率。

weixin_29296241的博客 248

"Not a bug" VS "Won't Fix"

经常听到开发和QA如下的对话:   Case 1:   QA:“在我机器上工作不正常”;   Dev: 换个干净的机器试试;   QA: 干净的机器是好的。   Dev: 那是你机器的问题,不是Bug.   QA: .... Case 2:   Dev: 你为什么要报这个bug呢,我的代码都是对的啊,我的程序都是没问题的啊!;   QA: 可是程序不应该有这个结果啊";

dfgj 2968

软考高级架构师笔记-10数学计算题

专栏《软考高级架构设计师》更新了,本章列举了10个场景计算题的解法,温故而知新,大家快来卷一卷

java后端开发的博客,不仅仅是后端开发 1597

UVA658 这不是bug,而是特性 It‘s not a Bug, it‘s a Feature!

题意:补丁在修正BUG时,有时也会引入新的BUG,假定有n(n<=20)n(n<=20) 个潜在BUG,和m(m<=100)m(m<=100) 个补丁,每个补丁用两个长度为nn 的字符串表示,其中字符串的每个位置表示一个bug,第一个串表示打补丁之前的状态(“-”表示该BUG必须不存在,“+”表示该补丁必须存在,0表示无所谓),第二串表示打补丁之后的状态(”-“表示不存在,“+”表示存在,0表示不变)。每个补丁有一定的执行时间,你的任务是用最小的时间把所有BUG都存在的软件变得没有.

gyp0205的博客 250

3D高斯压缩黑科技开源!1GB场景压到42MB,Web3D迎来“WebP时刻”——SOG格式深度解析

Web3D迎来革命性突破!PlayCanvas开源全新3D高斯泼溅压缩格式SOG,将1GB场景压缩至仅42MB,体积缩小95%,加载速度提升10倍+。SOG通过将3D数据编码为WebP纹理+元数据,实现GPU零拷贝实时渲染,完美兼容WebGL/WebGPU。实测显示,4百万高斯点的场景在手机上1.5秒内完成加载,内存占用降低83%。这一技术突破为电商展示、虚拟旅游、工业设计等领域带来新机遇,开发者可通过开源工具链快速集成。SOG被誉为"3D界的WebP",有望成为下一代3D互联网的基础设

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 862

利用 RSAU_LOG_API 把 SAP 安全审核日志接入企业 SIEM 的完整指南

在 SAP 世界里,安全审核日志(Security Audit Log,简称 SAL)是审计和合规的核心基础设施之一。系统会在后台把安全相关的关键事件记录下来,比如:(用户登录与登录失败用户锁定、解锁权限对象或角色变更远程调用(RFC)相关活动关键事务码的启动程序直接执行、批处理作业相关的敏感操作传统 ABAP 系统里,这些日志会写到本地应用服务器上的审计文件中(背后对应类似表RSAUENTR2的结构),包含事件标识、客户端、用户、终端、事务码、时间戳等信息。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 161

斐波那契数列以及Catalan数通项公式的推导

1、斐波那契数列的通项公式推导: 已知斐波那契数列的递推公式为f(n)=f(n−1)+f(n−2)f(n)=f(n-1)+f(n-2)f(n)=f(n−1)+f(n−2)且f(0)=0,f(1)=1f(0)=0,f(1)=1f(0)=0,f(1)=1。 设斐波那契数列的生成函数为F(x)F(x)F(x),F(x)=∑i=0nf(i)xiF(x)=\sum_{i=0}^nf(i)x^iF(x)=∑i=0n​f(i)xi。 ...

WedsonLin的博客 1947

YOLOv11改进-卷积-引入小波卷积WTConv 解决多尺度小目标问题

1.首先,WTConv利用二维Haar小波变换对输入图像进行多级分解。低频分量 (LL):捕捉图像的低频信息,如整体形状或轮廓。水平高频分量 (LH):捕捉图像中的水平边缘信息。垂直高频分量 (HL):捕捉图像中的垂直边缘信息。对角线高频分量 (HH):捕捉图像的对角线细节。在每一级的小波变换中,图像被下采样(空间分辨率减半),但频率信息得到了更细的分解。递归地执行小波变换(称为多级分解)可以得到不同尺度下的频率分量。

qq_64693987的博客 1万+

二次剩余与Cipolla算法

二次剩余与Cipolla算法 若存在x,使得 x2≡a(modp)x^2\equiv a \pmod{p}x2≡a(modp) 成立且a不是p的倍数,则称a为模p的二次剩余。 下文只讨论p为奇素数的情况。 1、模p二次剩余的个数 对于一个素数p,p的二次剩余有(p-1)/2个,非二次剩余有(p-1)/2个。 因为有(p−x)2≡x2(modp)(p-x)^2\equiv x^2 \pmod{p}(p−x)2≡x2(modp),所以在[1,(p-1)/2]范围内即可得到模p的所有二次剩余数,只需要证明在[1,

WedsonLin的博客 899

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Timus 1673(反欧拉函数)

Timus 1673(反欧拉函数) 题目链接 有题意可知,设第i个教授掌管的实验室编号为index,则满足index≡i(modN)index\equiv i\pmod Nindex≡i(modN);对于第k个同学,只去编号为index′=kx(k≥1)index'=kx(k\ge 1)index′=kx(k≥1)的实验室。如果第k个同学要获得考试资格,则满足如下同余方程组 {kx1≡1(modN)kx2≡2(modN)...kxN≡N(modN)\left\{\begin{matrix} kx_1\eq

WedsonLin的博客 663

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Miller-Rabin随机性素数测试方法

关于素数测试 素数测试就是判断一个整数是素数还是合数。一般判断素数p的方式是通过判断2到根号p内的整数是否可以整除p来实现。时间复杂度为O(p1/2)。如果p是一个m位二进制整数,m=floor(Ig(p+1)),O(p1/2)=O(2m/2)。 然而对于大整数而言,这样的时间复杂度显然是不可以接受的。 费马小定理:if n is prime   ∀a∈Zn∗ , an−1≡1(modn)if\space n\space is\

WedsonLin的博客 635

Codeforces Round #707 Div. 2/C Going Home

Codeforces Round #707 Div. 2/C Going Home 题意:在长度为N的数组A中找出满足ax+ay=aw+aza_x+a_y=a_w+a_zax​+ay​=aw​+az​的一组x,y,w,zx,y,w,zx,y,w,z,要求它们之间两两不同。(N≤2e5,1≤a[i]≤2.5e6(N\le 2e5,1\le a[i]\le 2.5e6(N≤2e5,1≤a[i]≤2.5e6 。 最简单直接的算法就是枚举序列中的(i,j)(i,j)(i,j)然后加以判断,这样做的做法是O(n2)O

WedsonLin的博客 610

关于概率的一些事(对于贝叶斯公式的一些初级理解)

关于概率的一些事 条件概率公式: P(A|B)=P(AB)/P(B)- - -111 当A,B事件相互独立时,有P(AB)=P(A)*P(B) P(B|A)=P(AB)/P(A)- - -222 联立111,222式,可得 P(A|B)=P(A)*P(B|A)/P(B)- - -333 333式也叫贝叶斯公式。 其中P(A)也叫先验概率(Prior probability),即在不知道B事件发生前,对A事件的一个主观评估的概率; P(A|B)也叫后验概率(Posterior probability),即在发

WedsonLin的博客 461

UVA 12563 (劲歌金曲)(多条件最优的动态规划问题)(01背包

UVA 12563 (劲歌金曲)(多条件最优的动态规划问题)(01背包) 依照题意可知,首要条件是:在t-1的时间内唱最多的歌曲数目,次要条件是:在不超过t-1的时间内唱的最久。 可以用dp_1[i]去表示在 i 时间内能唱的最多曲数。 用dp_2[i]去表示在 i 时间内能唱的最久时间。 状态转移的决策思想为: 1、如果在 j 时间内唱当前歌曲比不唱当前歌曲有着更大的歌曲数,那么同时更新dp_1和dp_2的值。 2、如果在 j 时间内唱当前歌曲和不唱当前歌曲有着一样的歌曲数,那么如果唱当前歌曲有着更长的唱

WedsonLin的博客 415

UVA1347(Tour)(DAG上的动态规划)

UVA1347(Tour)(DAG上的动态规划) 本题的难点主要在于状态的定义,即如何去表示节点的状态。 在紫书中,作者选择了dp(i,j)来表示第一个人走到了i点,第二个人走到了j点,且编号小于max(i,j)的节点都被走过。因为dp[i][j]和dp[j][i]是重复的,因此规定i>j。这样可以保证无后效性,因为小于max(i,j)的点都被选过了,接下来就是在大于max(i,j)里面选点,所以之后的状态不会影响到前面的状态。 接下来考虑状态如何转移,由于状态的定义,下一步只能向编号大于i的节点移动

WedsonLin的博客 413

扩展中国剩余定理(EXCRT)

扩展中国剩余定理(EXCRT) 中国剩余定理可以解形如下面的一元线性同余方程组: {ans≡x1(moda1)ans≡x2(moda2)ans≡x3(moda3)...ans≡xn(modan) \left\{\begin{matrix} ans\equiv x_1\pmod{a_1} \\ ans\equiv x_2\pmod{a_2} \\ ans\equiv x_3\pmod{a_3}\\ .\\ .\\ .\\ ans\equiv x_n\pmod{a_n} \end{matrix}\right.

WedsonLin的博客 407

Codeforces Round #707 (Div. 2, based on Moscow Open Olympiad in Informatics)/D

Codeforces Round #707 (Div. 2, based on Moscow Open Olympiad in Informatics)/D D.Two chandeliers 题意:给出两个无限循环序列A,B以及整数k,找出最小长度x满足对于1≤i≤x1\le i\le x1≤i≤x,恰好有k对ai≠bia_i\ne b_iai​​=bi​。 A序列的循环节长度为n,B序列为m。 对于序列A,B,找出循环节中所有的ai≠bia_i\ne b_iai​​=bi​的时间复杂度是O(nm)O

WedsonLin的博客 393

关于组合数取模

关于组合数取模 对于C(n,m) mod p (m<=n) 1、如果n,m比较,1<=m<=n<=1000,p<=1e9 可以用杨辉三角递推式去解决,用C[n][m]来储存C(n,m)的值,则递推式为: C[i][j] mod p=(C[i-1][j-1]+C[i-1][j]) mod p(1<=j<=i) C[i][0]=1 2、如果n,m较大,p较小(1<=m<=n<=1e18,p<=1e5 and p is prime) 可以用Luca

WedsonLin的博客 358

Codeforces Round #705 (Div. 2)/D. GCD of an Array

Codeforces Round #705 (Div. 2) D. GCD of an Array 题意:给出一个长度为n的数组,每次对其中一个元素进行乘法操作,然后询问整个数组的GCD。 首先肯定想到的是,对数组的元素进行质因数分解,然后每次更新只用更新单个元素的质因数表达式。同时维护所有元素共有质因数的最小次幂,以便求GCD。 之后需要考虑的式用什么数据结构来维护每个元素的质因数表达式和所有元素共有质因数的最小次幂。 1、对于维护每个元素的质因数表达式。如果用vector则不便于修改,方法之一是可以使用

WedsonLin的博客 352

UVA1601 The Morning after Halloween

UVA1601 The Morning after Halloween 本题型属于搜索题,通过bfs去枚举状态,从而找到解。然而该题的状态数上限是256的三次方,状态转移有5的3次方个方法,转移代价高。解决方法: 1、因为题目保证每2×2个方格一定有一个障碍,所以可以将所有空格提取出来。目的是在状态转移时不用每次去判断条件(越界、有障碍)。 2、双向bfs,将起点和终点同时放进队列。 3、A*算法。 锦上添花之举: 1、用编码(encoding)的方法将每个状态(节点的位置)压缩成一个整数再放进队列;取出来

WedsonLin的博客 348

UVA 10817 Headmaster‘s Headache(最优配对问题,DP,状态压缩)

UVA 10817 Headmaster’s Headache(最优配对问题,DP,状态压缩) 题目大意:有m个在校老师,n个求职者,s个课程,给出每个人的工资和授课集合,在校老师必须聘请,每个课程匹配至少两名老师,求最少工资开销。 咋一看,我的思路是用d(i,S)表示考虑前i个课程和集合S中的教师和求职者完成配对的最少工资开销,然后发现不行,状态转移表示不出来,而且集合无法用二进制表示。 参考了紫书上的分析,我发现我还是太年轻了。紫书上用d(i,s1,s2),表示考虑了前i个人,集合s1表示当前状态有且仅

WedsonLin的博客 346

UVA 1412 Fund Management (复杂状态的DP,状态池)

UVA 1412 Fund Management (复杂状态的DP,状态池) 受到前面题目的影响,一开始的思路是用d(i,s)表示经过第i天后,选择了集合s里面的股票的当前最大现金。但是发股票可以选多手,根本无法用集合表示。 由于每只股票的可持有的手数为(0<=ki<=8),最多有8只股票,所以表示当前手持股票资产的理论状态数最多有98<5*107种,但是由于还有一个持有总手数k的最大限制,实际状态数将远远低于这个值。实际状态数<1.5e4(我也不知道为什么) 所以用d(i,p)表示

WedsonLin的博客 335
上一篇: UVA 1151 Buy or Build(最小生成树,Kruskal)
下一篇: UVA 11582 Colossal Fibonacci Numbers(数论)
WedsonLin
博客等级 码龄7年 1粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值