LA 3667 Ruler 两种不同形式的搜索来解决

数字签名(Digital Signature)技术详解:从原理到实践 数字签名技术是数字世界身份认证和数据完整性的核心保障。它结合非对称加密和哈希函数两大密码学技术,实现双重安全防护:哈希函数确保数据完整性,非对称加密确保签名不可伪造。签名过程包括发送方用私钥加密文件哈希值生成签名,接收方用公钥验证签名并比对哈希值。RSA、DSA、ECDSA等主流算法各有特点,适用于不同场景。公钥基础设施(PKI)通过数字证书和CA认证建立信任链,确保公钥真实性。这套技术体系支撑着电子合同、软件认证、在线交易等各类数字安全应用,是现代网络信任体系的基石。 阅读详情

这题目让我对bfs有更加深刻的认识了,好题一枚。

解法有两种,一种是递增暴搜,一种是常规的队列搜索

Uva 1377

题意:给定一些要测量的刻度,然后你要制造一把尺子,能测量这些,要求尺子的刻度数尽量少,并且尺子尽量短,题目保证刻度数不会大于7.

递增暴搜通过递增限制条件(刻度位置)

#include<iostream>  
#include<cmath>  
#include<cstdio>  
#include<sstream>  
#include<cstdlib>  
#include<string>  
#include<string.h>  
#include<cstring>  
#include<algorithm>  
#include<vector>  
#include<map>  
#include<set>  
#include<stack>  
#include<list>  
#include<queue>  
#include<ctime>  
#include<bitset>  
#include<cmath>  
#define eps 1e-6  
#define INF 0x3f3f3f3f  
#define PI acos(-1.0)  
#define ll __int64  
#define LL long long  
#define lson l,m,(rt<<1)  
#define rson m+1,r,(rt<<1)|1  
#define M 1000000007  
//#pragma comment(linker, "/STACK:1024000000,1024000000")  
using namespace std;  
  
#define Maxn 55  
#define Maxm 1100000  
int hav[Maxm],sa[Maxn],n,ans;  
bool vis[Maxn];  
int dis[Maxn];  
  
bool dfs(int cur)  
{  
    if(cur==ans)  
    {  
        for(int i=1;i<n;i++) //前n-1个长度都能够测量  
            if(!vis[i])  
                return false;  
        return true;  
    }  
    for(int i=1;i<cur;i++)  
    {  
        for(int j=1;j<n;j++)  
        {  
            if(!vis[j])  
            {  
                int dd=dis[i]+sa[j];//当前刻度  
                if(dd<=dis[cur-1]) //比之前大  
                    continue;  
                if(dd>=sa[n])//要比最大小  
                    continue;  
                dis[cur]=dd;  
  
                queue<int>myq; //记录标记的长度,回溯时返回  
                for(int k=1;k<cur;k++) //加入当前刻度后,新增的能够出的长度  
                {  
                    int temp=dis[cur]-dis[k];  
                    if(hav[temp]&&!vis[hav[temp]])  
                    {  
                        vis[hav[temp]]=true;  
                        myq.push(hav[temp]);  
                    }  
                }  
                int la=sa[n]-dis[cur]; //最后一段  
                if(hav[la]&&!vis[hav[la]])  
                {  
                    vis[hav[la]]=true;  
                    myq.push(hav[la]);  
                }  
                if(dfs(cur+1))  
                    return true;  
                while(!myq.empty())  
                {  
                    la=myq.front();  
                    myq.pop();  
                    vis[la]=false;  
                }  
            }  
        }  
    }  
    return false;  
}  
int main()  
{  
    //freopen("in.txt","r",stdin);  
   //freopen("out.txt","w",stdout);  
   int cas=0;  
  
   while(~scanf("%d",&n)&&n)  
   {  
       for(int i=1;i<=n;i++)  
            scanf("%d",&sa[i]);  
       sort(sa+1,sa+n+1);  
       n=unique(sa+1,sa+n+1)-sa-1;  
       memset(hav,0,sizeof(hav));  
       for(int i=1;i<=n;i++)  
            hav[sa[i]]=i;  
  
       dis[1]=0;  
       ans=2;  
       while(ans*(ans-1)/2<n)  
            ans++;  
  
       memset(vis,0,sizeof(vis));  
       while(!dfs(2))  
            ans++;  
  
       printf("Case %d:\n%d\n",++cas,ans);  
       printf("%d",dis[1]);  
       dis[ans]=sa[n];  
  
       for(int i=2;i<=ans;i++)  
          printf(" %d",dis[i]);  
       putchar('\n');  
  
   }  
    return 0;  
}  

第二种bfs通过将目标也就是状态放入队列的方法来进行搜索。

#include <iostream>  
#include <cstdio>  
#include <cstring>  
#include <algorithm>  
#include <set>  
#include <queue>  
using namespace std;  
#define MAX_SIZE    1000010  
//#define LOCAL  
struct Node  
{  
    set<int> st;  //存储当前可表示的刻度  
    int found;    //选取了哪些需要表示的刻度,二进制从小到大表示  
};  
char idx[MAX_SIZE];   //需要表示那些具体刻度idx[v]即刻度v是否是需要的刻度  
set<int> ans;  
int N;  
int arr[100];  
int MAX;//最大刻度  
int staus; //满足要求刻度状态  
  
void bfs()  
{  
    Node temp;temp.found=0;temp.st.insert(0);  
    queue<Node> q;  
    q.push(temp);  
    while(!q.empty())  
    {  
        Node cur = q.front();q.pop();  
        if(cur.found==staus)  
        {  
            if(cur.st.size()<ans.size())  
                ans = cur.st;  
            else if( *cur.st.rbegin() < *ans.rbegin())  
                ans = cur.st;  
            return;  
        }  
        for(set<int>::iterator iter=cur.st.begin(); iter!=cur.st.end(); iter++) //遍历可表示刻度  
        {  
            Node next;int i;  
            for(i=0; i<N; i++)  
            {  
                //如果已被选取  
                if(cur.found&(1<<i)) continue;              //刻度已选取  
                int v = *iter+arr[i];  
                if(cur.st.find(v)!=cur.st.end()) continue;//刻度已可表示  
                if(v>MAX)  continue;//超过最大刻度,不需要  
                next=cur;  
                next.st.insert(v);  
                //添加新增此刻度后可表示的新刻度  
                for(set<int>::iterator iter2=cur.st.begin();iter2!=cur.st.end(); iter2++)  
                {  
                    int x=abs(v-*iter2);  
                    if(idx[x]!=-1)  
                    {  
                        next.found|=(1<<idx[x]);  
                    }  
                }  
                if(next.found!=cur.found)  
                    q.push(next);  
            }  
            for(i=0; i<N; i++)  
            {  
                //如果已被选取  
                if(cur.found&(1<<i)) continue;              //刻度已选取  
                int v = *iter-arr[i];  
                if(cur.st.find(v)!=cur.st.end()) continue;//刻度已可表示  
                if(v>MAX)  continue;//超过最大刻度,不需要  
                if(v<0)     continue;  
                next=cur;  
                next.st.insert(v);  
                //添加新增此刻度后可表示的新刻度  
                for(set<int>::iterator iter2=cur.st.begin();iter2!=cur.st.end(); iter2++)  
                {  
                    int x=abs(v-*iter2);  
                    if(idx[x]!=-1)  
                    {  
                        next.found|=(1<<idx[x]);  
                    }  
                }  
                if(next.found!=cur.found)  
                    q.push(next);  
            }  
        }  
    }  
}  
int main()  
{  
    int i,cnt=1;  
#ifdef LOCAL  
    freopen("c:\\1.txt","r",stdin);  
#endif  
    while(scanf("%d",&N)==1)  
    {  
        if(N==0) break;  
        memset(idx,-1,sizeof(idx));  
        ans.clear();  
        for(i=0; i<N; i++)  
        {  
            scanf("%d",&arr[i]);  
            ans.insert(arr[i]);  
        }  
        sort(arr,arr+N);  
        N = unique(arr,arr+N) - arr;  
        MAX=arr[N-1];  
        for(int i=0; i<N; i++)  
            idx[arr[i]] = i;  
        staus = (1<<N)-1;  
        bfs();  
        printf("Case %d:\n%d\n",cnt++,ans.size());  
        for(set<int>::iterator iter=ans.begin(); iter!=ans.end(); ++iter)  
            printf("%d ",*iter);  
        printf("\n");  
    }  
    return 0;  
}  



Wsl/InstallDistro/Service/RegisterDistro/CreateVm/HCS/E_INVALIDARG 摘要:安装WSL2时遇到E_INVALIDARG错误(多核CPU问题),可通过创建.wslconfig配置文件解决。配置内容包括:渐进式内存回收、自动代理、模拟虚拟系统调用、限制内存为4GB和处理器核心数为4。需确保已启用虚拟机平台和Linux子系统功能。 (98字) 阅读详情

相关推荐

浅谈IC测试向量(pattern)及其转换

随着集成电路的飞速发展,其规模越来越大,对电路的质量与可靠性要求进一步提高,集成电路的测试方法也变得越来越困难,为了实现芯片的快速测试和筛选,ATE设备为其提供了强有力的支撑。ATE运用芯片设计仿真文件,将其作为芯片输入激励,通过ATE测试平台提供芯片测试环境,将芯片的输出和测试结果进行比较,以此来判定芯片的好坏。 说起IC测试,不得不说一下Pattern这个词,它中文的意思是模式。在图像处理中,这个词意思为图像的纹理特征,而在IC也即芯片测试行业,这个词实际上代表了需要测试芯片的时序特征。简单的说,在测

flomingo1的专栏 1万+

LA3667

题目大意: 给出n种距离di,设计一个有m个刻度的尺子,使得每个di都可以直接量出来,要求在m尽量小的前提下保证尺子总长度尽量短。思路: 递增暴力搜索代码:#include <iostream> using namespace std; #include <cstring> #include <queue> #include <stdio.h> #include <algorithm> #def

不努力只能看别人脸色。 664

手把手教你配置MAX96712解串器:从I2C地址分配到PWM帧同步

本文详细解析了MAX96712解串器在自动驾驶视觉链路中的核心配置流程。从I2C地址分配、GMSL2数据流映射到实现多摄像头精准同步的PWM帧同步触发,手把手指导工程师构建高可靠性的图像传输系统,并提供了实用的Linux调试技巧与问题排查思路。

weixin_29297127的博客 920

LA 3667 Ruler IDA* .

题目地址:http://vjudge.net/problem/UVALive-3667 一开始 以为就是DFS搜索,选择题目中给的刻度,一个一个试,最短的的那个就是答案, 而且题目给的刻度是小于等于50的,那很明显可以用二进制压缩 然而 竟然是刻度不是题目给出的,所以枚举都错了 迭代加深搜索+剪枝 #include using namespace std; #define REP(i,

BRCOCOLI的博客 622

<202505高项>《【VIP合集】 软考高项(第四版)十大知识域、五大过程组、ITTO输入输出工具、项目绩效域》

软考高项(第四版)十大知识域、五大过程组、ITTO输入输出工具、项目绩效域

Else 的博客 1850

RedVQA:轻量级无参考视频质量评估算法原理与工程实践

视频质量评估是计算机视觉领域的关键技术,旨在通过算法自动量化视频的观看体验。其核心原理在于模拟人眼视觉系统,从像素数据中提取并融合空域和时域特征,以预测主观质量分数。这项技术的价值在于,它能自动化处理海量视频内容的质量监控,为流媒体服务、移动设备影像优化等场景提供关键指标。无参考视频质量评估作为该领域的前沿方向,无需原始无损视频作为参考,更贴合实际应用。本文以RedVQA项目为例,深入剖析了如何利用轻量化的深度网络架构,如MobileNetV3,结合高效的时空特征融合模块,在保证评估精度的同时,大幅降低计算

weixin_28698129的博客 575

LA 3667 刻度尺

题目大意 给定n和刻度d,设计一个拥有m个刻度的尺子,使得每个d都可以直接的量出来,要求在m尽量小的情况下保证尺子的总长度尽量短. 分析 此题目应该采用迭代深搜 #include<iostream> #include<algorithm> #include<string.h> #include<queue> #define maxd 1000000+...

tccsx_o的博客 262

GD32H7实战:5步搞定YOLO轻量化模型部署到MCU(附避坑指南)

本文详细介绍了如何将YOLO轻量化模型部署到GD32H7 MCU的完整实战流程。通过五个关键步骤,涵盖环境搭建、模型训练、格式转换到工程集成,并重点分享了使用GD32AI-ModelZoo工具链进行MCU部署的避坑指南,帮助开发者在资源受限的边缘设备上实现高效目标检测。

weixin_29070861的博客 445

UVA 1377 Ruler(dfs)

这题目自己写一直WA,后来发现正确搜索枚举的刻度并不一定是题目中给你的,而可能是两个刻度中间隔的,枚举完整之后答案就会完备而且可能会更优。#include #include #include #include #include using namespace std; const int maxn=50+5; int vis[maxn],d[maxn],id[1000000+10],a[maxn]

qq_33901573的博客 357

【XR技术介绍】深度解析|AI眼镜核心技术架构:从硬件层到端云AI全链路拆解

本文将逐层拆解AI眼镜完整技术架构,梳理硬件、感知、光学、端侧AI、软件云端五大核心层级,剖析核心数据流与行业技术瓶颈,同时附上标准化技术架构图,适合技术学习、方案汇报、行业科普使用。

houdou112358的博客 431

在Android Jetpack Compose中实现夜间模式

Android基于Compose的深色主题实现

虎哥LoveDroid 1234

UVA1377

读完题意就知道是一个暴力乱搞题,但是苦于水平有限,只能赛后补 UVA1377 题意:n个长度值,需要提供一把刻度尺,尺子上的刻度越少越好,尺子越短越好,要求是:必须有0刻度,n个长度值可以直接测量 注意hint的提示:最多就是7个! 我自己想的是二进制枚举: 把0这个长度值放入n个长度值中 任意一个状态用一个整数表示,然后去判断,选择覆盖了所有长度值得方案 因为i

ACdream 871

CVAEGAN实现锂离子电池EIS数据增强:基于健康状态的阻抗谱生成

本文提出了一种基于CVAEGAN的锂离子电池EIS数据增强方法。该方法结合了变分自编码器和生成对抗网络的优点,能够根据指定的健康状态(SoH)生成高质量的EIS阻抗谱数据。文章详细介绍了数据预处理流程、模型架构设计(包括编码器、解码器和判别器),并提供了完整的PyTorch实现代码。通过条件生成的方式,该方法可以有效解决电池健康评估中标注数据不足的问题,为基于数据驱动的电池诊断提供更丰富的训练样本。实验结果表明,生成的EIS数据具有良好的真实性和多样性,可用于增强电池健康状态评估模型的性能。

huanghm88的专栏 497

UVA 1377 Ruler bfs+状压搜索

题目链接:点击打开链接 题意:给定n个刻度。下面是n个刻度。 要构造一个尺子使得上面的n个刻度能直接量出来。 且要满足尺子上的刻度线个数最少,最少的情况下尺子最短。 第一个刻度总为0 题目保证总是存在 思路: bfs,每次枚举新加一个刻度后,哪些可以直接量出来,用二进制表示,然后暴力搜 import java.io.PrintWriter; import java.util.Arr

九野的博客 1444

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

UVA 1377 - Ruler(BFS + 状态判重)

Xiaoming wants to make a special ruler, which can directly measure several given lengths. Xiaoming hopes to find a way, making the scale on ruler as few as possible, while for a given length, there ex

Remilia's 2335

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

UVa1377 Ruler(dfs或者bfs)

问题:要求尺子可以测量给定的长度,并且要求刻度尽量少,长度尽量短 思路:采用广度优先搜索,初始状态中的刻度集合中只包含0,扩展新的状态时,有两种方式 ,一种是在当前的集合刻度上加上没有重复的长度,要求加后的长度不能超过最大值。另外一种方式是用当前的集合刻度减去没有重复的长度。 使用深度优先搜索方法时,先计算出可行的状态集合。在可行的状态集合中作选择。因为要求长度尽量短,所以可行的状态集合中包含...

多看多听多总结 387

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

uva 1377 - Ruler(BFS)

题目链接:uva 1377 - Ruler 题目大意:给出一些刻度,要求制作一把尺子,可以直接测量出给出的刻度,要求尺子尽量短,并且刻度尽量少,注意:所标记的刻度数不会大于7,题目限制。 解题思路:注意题目中的限制,说刻度数最大为7,C(2,7) = 21,也就是说最多能表示21个长度,题目所给出的50个长度有一半多式重复的长度。让后题目还有一个限制条件,说尺子尽量短,也就是说最大的刻...

xiaoheliushuiya 194

UVA - 1377 Ruler

题目 第一道想了一天想出来的的题目。 思路: 既然是找最短的,那BFS可以考虑。 可以肯定的是,最小的结果的最大值一定是输入的最大值。 考虑这样一组数据 4 3 5 17 19 结果是 4 0 2 5 19 可以猜到,最后结果的每个数都只能从原数据中或者各个原数据相减得到的新数据中选出。 那就把原数据扩大,然后BFS选即可。 #include &lt;bits/stdc...

vivian_hy的博客 281

UVa 1377 - Ruler(BFS)

RT

一只冰熊 1053

la 3667 ruler

题目链接: 点击打开链接 题目大意: 给出n个数字,要求设计一个尺子,刻度尽量少,长度尽量短,能够把n个数字都表示出来。刻度不超过7个,第一个刻度为0. 思路: bfs 分析:  学习了网上大牛的代码,搜索树的状态为一个set,记录所有刻度;以及一个status,用二进制记录能表示的数字。对于一个状态,遍历该状态的所有刻度,每个刻度加上或减去一个数字可以得到一个新刻度。

kthsdwwl 915

LA 3667 Ruler

bfs搜索,学习http://www.cnblogs.com/woaishizhan/archive/2012/12/19/2825398.html的代码后自己写了一遍 #include #include #include #include #include #include using namespace std; #define MAX_SIZE 1000010 //#d

无题 1501

UVALive - 3667 Ruler

题意:给出n种距离,设计一个有m个刻度的尺子,使得每个刻度都可以直接量出,要求在m尽量小的情况下尺子的总长度尽量短,第一个必须是0,输出保证m 思路:首先先确定出最小的m,Cm(2)解出可能的最小的m,那么接着开始枚举m,每次得到的一个解都是有给出的n种距离和已有的解的出来的,那么这个解又能得到与之前得出来的解的差和与最大尺度差的两种解,还有几个地方需要减枝,比如解是严格的递增的,还有如果超过最

那些年 1439

UVALive 3667 dfs

UVALive 3667 Ruler

WeiGuan_的博客 410

UVALive 3667 Ruler(回溯搜索)

题意: 给出n种距离,设计一个有m个刻度的尺子,使得每个刻度都可以直接量出,要求在m尽量小的情况下尺子的总长度尽量短,第一个必须是0,输出保证m<=7m<=7。 解析: 回溯搜索,先确定下第一个刻度是0,第二个刻度是d[0],用vis数组来记录每个d[i]d[i]是否被用过,然后枚举 arr[j]+d[i]arr[j] + d[i],arrarr数组指的是当前已经选出的刻度,当arr[j]+

小G的ACM之路 974

UVALive 3667 Ruler (模拟)

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1668 题意:      给定一些长度,求在尺上最少标几个刻度,可以使得利用刻度差求得给定的所有长度。在满足刻度数量最少的前提下,还需保证总长度最小。 解题:

David_Jett 1036

uvalive3667(深搜)

题意: 要求给一个尺子刻m个刻度,给出n种距离,都可以由这m个刻度直接量出来,比如你刻了10,15;那么你也可以直接量出5;求最少刻几个刻度,并且尺子尽量短,给出刻度的位置;刻度数 思路: 这题我们可以确定两个,一个是0,另一个是最大的那个; 然后因为刻度最大是7个;我们可以从2开始到7枚举; 然后dfs判断是否可以;判断过程就是

潜水的程序猿 1132
上一篇: 动态规划之最长上升子序列
下一篇: codeforces 150C Smart Cheater 线段树区间合并
labrother
博客等级 码龄11年 2粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值