NOI OpenJudge 1805 碎纸机

NOI 1805:碎纸机 DFS深度优先搜索/map记录答案/string转int 题目 原站链接 描述 你现在负责设计一种新式的碎纸机。一般的碎纸机会把纸切成小片,变得难以阅读。而你设计的新式的碎纸机有以下的特点: 1.每次切割之前,先要给定碎纸机一个目标数,而且在每张被送入碎纸机的纸片上也需要包含一个数。 2.碎纸机切出的每个纸片上都包括一个数。 3.要求切出的每个纸片上的数的和要不大于目标数而且与目标数最接近。 举一个例子,如下图,假设目标数是50,输入纸片上的数是12346。碎纸机会把纸片切成4块,分别包含1,2,34和6。这样这些数的和是43 (= 1 + 2 + 34 + 6) 阅读详情

描述
你现在负责设计一种新式的碎纸机。一般的碎纸机会把纸切成小片,变得难以阅读。而你设计的新式的碎纸机有以下的特点:

1.每次切割之前,先要给定碎纸机一个目标数,而且在每张被送入碎纸机的纸片上也需要包含一个数。
2.碎纸机切出的每个纸片上都包括一个数。
3.要求切出的每个纸片上的数的和要不大于目标数而且与目标数最接近。

举一个例子,如下图,假设目标数是50,输入纸片上的数是12346。碎纸机会把纸片切成4块,分别包含1,2,34和6。这样这些数的和是43 (= 1 + 2 + 34 + 6),这是所有的分割方式中,不超过50,而又最接近50的分割方式。又比如,分割成1,23,4和6是不正确的,因为这样的总和是34 (= 1 + 23 + 4 + 6),比刚才得到的结果43小。分割成12,34和6也是不正确的,因为这时的总和是52 (= 12 + 34 + 6),超过了50。

还有三个特别的规则:
1.如果目标数和输入纸片上的数相同,那么纸片不进行切割。
2.如果不论怎样切割,分割得到的纸片上数的和都大于目标数,那么打印机显示错误信息。
3.如果有多种不同的切割方式可以得到相同的最优结果。那么打印机显示拒绝服务信息。比如,如果目标数是15,输入纸片上的数是111,那么有两种不同的方式可以得到最优解,分别是切割成1和11或者切割成11和1,在这种情况下,打印机会显示拒绝服务信息。

为了设计这样的一个碎纸机,你需要先写一个简单的程序模拟这个打印机的工作。给定两个数,第一个是目标数,第二个是输入纸片上的数,你需要给出碎纸机对纸片的分割方式。
输入
输入包括多组数据,每一组包括一行。每行上包括两个正整数,分别表示目标数和输入纸片上的数。已知输入保证:两个数都不会以0开头,而且两个数至多都只包含6个数字。

输入的最后一行包括两个0,这行表示输入的结束。
输出
对每一组输入数据,输出相应的输出。有三种不同的输出结果:

sum part1 part2 …
rejected
error

第一种结果表示:
1.每一个partj是切割得到的纸片上的一个数。partj的顺序和输入纸片上原始数中数字出现的次序一致。
2.sum是切割得到的纸片上的数的和,也就是说:sum = part1 + part2 +…
第一种结果中相邻的两个数之间用一个空格隔开。

如果不论怎样切割,分割得到的纸片上数的和都大于目标数,那么打印“error”。
如果有多种不同的切割方式可以得到相同的最优结果,那么打印“rejected”。

题目好长….我稍微总结一下题意。
就是给你两个数,一个是目标数,一个是纸片数,你需要把纸片数切成好几部分,然后把它们加起来组成一个新数,如12345可以拆成(1+2+3+4+5)==15。
要求组成的新数要比目标数小,还要尽量大。

如果目标数和纸片数相同的话,直接输出他俩就完了,
如果切出来的能组成的尽量大的数有多种方案,puts(“rejected”);
如果能切出来符合条件的数,输出组成这个数的所有数字….

这个题,我们可以从简单到难来想。
首先如果目标数和纸片数相同的话,直接输出他俩就完了,
然后
如果不论怎样切割,分割得到的纸片上数的和都大于目标数,那么打印“error”。,我们一开始将答案附成一个极小值(比如说-1),如果DFS完了,答案还是极小值,说明没有答案。

如果切出来的能组成的尽量大的数有多种方案,puts(“rejected”);先立个flag,我们在DFS的过程中是不断更新答案的,如果当前搜到的答案和之前更新的答案一样,将flag=1,如果搜到了新的答案,将flag=0,这样。当flag==1的时候,puts(“rejected”);

把以上三种情况排除,那么问题来了…我们要怎么切数?
我们可以把纸片数一位一位拆到数组里,当我们DFS的时候,记录一个参数,为当前搜到了纸片数的第几位,当最后一位已经搜过了的时候,我们就得到了一种切割方案,详情怎么切,见下↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

void dfs(int tot,int num,int cnt) 
{//这是DFS的拆数部分
    if(num>m)//m为要切的数的位数,tmp为切出来的每一部分的值,shu记录的是每一位的值
    {//hah为切出来的数的总和,cnt为切出来的数的数量
        int hah=0;
        for(int i=1;i<cnt;i++)
            printf("%d ",tmp[i]),hah+=tmp[i];
        printf("%d\n",hah); 
        puts("");
    }
    int hah=0;
    for(int i=num;i<=m;i++)
    {
        hah*=10;//
        hah+=shu[i];//这两句很重要。
        tmp[cnt]=hah;
        dfs(tot+hah,i+1,cnt+1);//这里tot没卵用...
    }
}

上面的tmp数组,储存的就是切开的数的各个部分,我们要开一个ans1数组,当我们更新到更大的部分和的时候的时候,将ans1数组里的值全都赋成当前tmp数组里的值。

这个题就这么完了…

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n,m;
int shu[23333];
int tmp[23333];

bool flag1;
void clr()
{
    memset(shu,0,sizeof(shu));
    flag1=0;
}
int ans1[23333];
int ans;
int lenth;
void dfs(int tot,int num,int cnt)
{
    if(tot>n)
        return;
    if(num>m)
    {
        if(tot==ans)
        {
            flag1=1;
            return;
        }
        if(tot>ans)
        {
            flag1=0;
            ans=tot;
            for(int i=1;i<cnt;i++)
                ans1[i]=tmp[i];
            lenth=cnt-1;
        }
        return;
    }

    int hah=0;
    for(int i=num;i<=m;i++)
    {
        hah*=10;
        hah+=shu[i];
        tmp[cnt]=hah;
        dfs(tot+hah,i+1,cnt+1);
    }
}
int main()
{
    while(1)
    {
        clr();
        string a;
        scanf("%d",&n);
        ans=-1;
        cin>>a;
        int hah=0;
        m=a.size();
        if(n==0)
        break; 
        for(int i=0;i<m;i++)
        {
            shu[i+1]=a[i]-'0';
            hah*=10;
            hah+=shu[i+1];
        }

        if(hah==n)
        {
            printf("%d %d\n",n,n);
            continue; 
        }
        dfs(0,1,1);
        if(flag1)
        {
            puts("rejected");
            continue; 
        }
        if(ans==-1)
            puts("error");
        else
        {
            printf("%d ",ans);
            for(int i=1;i<=lenth;i++)
            {
                printf("%d ",ans1[i]);
            }
            puts(""); 
        }
    }
    return 0;
}
http://noi.openjudge.cn/——2.5基本算法之搜索——1805:碎纸机 阅读详情

相关推荐

noi 1805 碎纸机-----搜索

http://noi.openjudge.cn/ch0205/1805/ 算法 暴力搜索,Dfs+剪枝 注意 有些情况下可以直接判断: 1.把要“剪碎”的数全都拆成一位数,此时和最小,如果这种情况下和都比目标数大,说明没有成立的情况,输出“error”; 2.要“剪碎”的数本身比目标数还小(或相等),那么最优的情况就是不进行任何处理,直接输出两遍原数。 代码实现 #include

zero_from的博客 607

openjudge noi 1805 碎纸机

前往原题因为原题面太长我就不粘了2333 这个题一看就是搜索啊。

Loi_Mapleleaf的小池 553

基于 Python 的 LIF 模型:探索神经元同步与小世界网络

首先,我们定义了一个LIFNeuronself.soma.L = self.soma.diam = 12.6157 # 固定神经元形状self.cm = cm # 电容self.V_rest = V_rest # 静息电位self.V = V_rest # 初始化膜电位在初始化过程中,每个神经元被赋予初始的静息电位,并且其膜电位会在后续的模拟过程中动态变化。

qq_36224726的博客 1423

POJ 1416 && OpenJudge 1805 Shredding Company (DFS+剪枝)

1805:碎纸机 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 你现在负责设计一种新式的碎纸机。一般的碎纸机会把纸切成小片,变得难以阅读。而你设计的新式的碎纸机有以下的特点:1.每次切割之前,先要给定碎纸机一个目标数,而且在每张被送入碎纸机的纸片上也需要包含一个数。 2.碎纸机切出的每个纸片上都包括一个数。 3.要求切出的每个纸片上的数的和要不大于

Loi_MeiCo の 博客 705

在cadence中进行sdf文件的反标及并进行数模混仿

3.在Main-Include Option Settings-Libraries Files/Directories下面加载上面说到的两个.v文件(综合文件和工艺库器件文件),其他默认点击OK;最近在做一个数模混合电路的流片工作,数字部分综合后会生成一个.sdf(标准延时格式)文件,正常来说应该是要在vcs软件上进行电路延时的反标,但由于我的电路需要信号在数字模块和模拟模块中来回循环多次,因此,打算在cadence中完成sdf文件反标,进行数模混合仿真。1.综合生成的电路网表的.v文件;

WSBHX的博客 3269

485芯片AB波形正负半周的问题探讨

      本人做的一个产品,产品的其中一个接口是RS485的,我们使用的芯片是MAX13487E。MCU是STM32F103,MCU的USART通过光耦隔离后,接到MAX13487E。因为STM32F103的VCC是3.3V的,MAX13487E的VCC是5V。      部分原理图如下,上述部分电路参考了官方的参考设计,现在测试的AB波形时候发现如下问题。1.把R10和R16改为1k,示波器C...

qq_26308521的博客 1万+

OpenJudge noi1805碎纸机

Description 你现在负责设计一种新式的碎纸机。一般的碎纸机会把纸切成小片,变得难以阅读。而你设计的新式的碎纸机有以下的特点: 1.每次切割之前,先要给定碎纸机一个目标数,而且在每张被送入碎纸机的纸片上也需要包含一个数。 2.碎纸机切出的每个纸片上都包括一个数。 3.要求切出的每个纸片上的数的和要不大于目标数而且与目标数最接近。 举一个例子,如下图,假

loi_black蒟蒻的博客 965

SAP销售订单POD实操:从VL01N创建到VLPOD差异处理,保姆级避坑指南

本文详细解析SAP销售订单POD全流程,从VL01N创建到VLPOD差异处理,提供保姆级避坑指南。涵盖核心业务逻辑、前置配置、销售订单创建、交货单处理及差异解决方案,帮助用户高效管理供应链执行环节,确保财务与物流的准确对接。

weixin_27219587的博客 624

NOI2.5.1805碎纸机 题解

NOI2.5.1805碎纸机 题解 这回的题目看上去就非常的令人懵逼。一看内容,发现事情并不简单。 题目: 描述 你现在负责设计一种新式的碎纸机。一般的碎纸机会把纸切成小片,变得难以阅读。而你设计的新式的碎纸机有以下的特点: 1.每次切割之前,先要给定碎纸机一个目标数,而且在每张被送入碎纸机的纸片上也需要包含一个数。 2.碎纸机切出的每个纸片上都包括一个数。 3.要求切出的每个纸片上的数的和要不大...

jerry20183的博客 537

PS射击游戏射线检测优化:原理、工程与全链路高性能实现

射线池:减少GC,提升批量检测效率。分层检测:先粗后细,远距离射击高效判定。批量检测:并行处理,适合大量射线场景。空间结构:进一步加速大场景检测。下面继续深入射线检测优化,补充更多实用细节和进阶技巧,包括空间分区加速、射线检测多线程/异步化、射线合并与分帧、射线池通用模板、常见性能陷阱与调优建议等。对于极端性能需求,可自定义轻量级物理系统,仅检测关键对象(如玩家、子弹),跳过复杂物理引擎。结合AABB、OBB、球体等简单碰撞体,射线-包围体检测极快。空间分区+分层检测是大场景射线优化核心。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 434

17、非线性动力学特征在情感语音与食管语音分析中的应用

本文探讨了非线性动力学特征在情感语音与食管语音分析中的应用。在情感语音识别中,选取Hurst指数、相关维数和Lempel-Ziv复杂度等混沌特征结合统计量,通过神经网络实现了中性、恐惧和愤怒情感的高效分类,全局成功率高达93.78%。在食管语音分析中,针对其缺乏明显周期性的问题,提出基于改进自相关方法的基频测量流程,包括包络计算、平滑与峰值细化,并对基频的物理意义提出思考。研究展示了两类语音在特征表现与技术方法上的差异,展望了其在客服、安全、医疗康复等领域的应用前景,并指出了未来在特征拓展、算法优化和发声机

sunny的博客 73

openjudge 1805碎纸机 解析报告

openjudge 1805:碎纸机 解析报告总时间限制: 1000ms 内存限制: 65536kB描述你现在负责设计一种新式的碎纸机。一般的碎纸机会把纸切成小片,变得难以阅读。而你设计的新式的碎纸机有以下的特点: 1.每次切割之前,先要给定碎纸机一个目标数,而且在每张被送入碎纸机的纸片上也需要包含一个数。2.碎纸机切出的每个纸片上都包括一个数。3.要求切出的每个纸片上的数的和要不大于...

weixin_30810583的博客 116

Android Camera驱动开发工程师面试指南:技术深度与实战准备

摘要:上海移远通信招聘Android Camera驱动开发工程师,主要负责Camera传感器驱动开发维护、高通/展锐平台底层开发及技术预研。岗位要求1年以上嵌入式开发经验,精通Camera传感器驱动调试,熟悉高通平台Camera架构及Android HAL框架。具备HAL开发、算法集成或车载/支付行业经验者优先。工作内容以Driver/HAL开发为主,需具备硬件接口评估能力。该职位接受Linux/单片机背景人员转型。

郑伟强dev的专栏 280

碎纸机

描述 你现在负责设计一种新式的碎纸机。一般的碎纸机会把纸切成小片,变得难以阅读。而你设计的新式的碎纸机有以下的特点: 1.每次切割之前,先要给定碎纸机一个目标数,而且在每张被送入碎纸机的纸片上也需要包含一个数。 2.碎纸机切出的每个纸片上都包括一个数。 3.要求切出的每个纸片上的数的和要不大于目标数而且与目标数最接近。 举一个例子,如下图,假设目标数是50,输入纸片上的数是123

u013417383的专栏 1346

图像拼接——ITKMontage

ITKMontage是一个开源的、高性能的图像拼接软件模块。它的核心任务是将多张部分重叠的图像瓦片(Tiles)拼接成一幅完整的大图,专为处理材料显微科学中产生的大规模、高分辨率图像而设计。针对ITKMontage模块中示例进行了修改,解决了没有文件TileConfiguration.txt的情况,以及使用中的一些BUG。ITKMontage可以单独编译,也可以作为ITK的一个模块进行编译,介绍后一种的cmake设置。本文介绍使用ITKMontage模块进行图像拼接的方法。此处省略编译后的库配置。

2301_79131410的博客 100

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

1805:碎纸机 (java实现 DFS 回溯)

题目链接 dfs,转化为处理子问题如123456,1和子问题“23456”,12和子问题“3456”等 注意遇到重复的切割方式不能简单的修改ans=-2,因为当再次遇到相同方式,会覆盖掉-2. import java.util.*; public class Main { public static int ans=-1;//如果此值未修改,则输出error public static boolean flag=false;//标记是否出现了重复的切割方案 public static Link

Kerin的博客 788

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

NOI: 碎纸机

文章目录一、题目大意二、解题思路三、代码 一、题目大意 切数字,求和,与目标数字比较,要就尽可能接近目标数字且比目标数字小。 二、解题思路 深搜,如果数字长n,则可以切[0, n-1]刀。对每种枚举。 其中由于我们只在意切得位置而不在意切得顺序,因此我们使用一个标记start(见代码)表示最后一刀在哪个数字后。 三、代码 #include<iostream> #include<s...

Wangpeiyi9979的博客 388

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

noi1805:碎纸机--搜索

http://noi.openjudge.cn/ch0205/1805/ 题目分析: 搜索,从当前节点出发,扩展出两种状态,就是和下一个数组合与否, 超过了就剪枝,记录状态.,并判重. 先用了类似排列的做法,写了一上午,9个点过了6个,写的有的麻烦,懒得再改了. 然后参考了别人的代码,结果自己处理边界的出错,导致最后一个数是0的时候出错,然后花了不少时间才找出来. #

lengxuenong的博客 848

百练 2803:碎纸机

2803:碎纸机 总时间限制: 1000ms 内存限制: 65536kB 描述 你现在负责设计一种新式的碎纸机。一般的碎纸机会把纸切成小片,变得难以阅读。而你设计的新式的碎纸机有以下的特点: 1.每次切割之前,先要给定碎纸机一个目标数,而且在每张被送入碎纸机的纸片上也需要包含一个数。 2.碎纸机切出的每个纸片上都包括一个数。 3.要求切出的每个纸片上的数的和

u013412498的专栏 1877

ISCC 2019 杂项 碎纸机(“想要我的宝藏吗?如果想要的话,那就到碎纸机中找吧,我全部都放在那里。”)

先下载吧 下载之后 打开 是一个 jpg文件 打开 真的是一个碎纸机 将文件名称改为 .zip 解压后可以得到 十张图片!!! 还有一个文本文件如下 碎纸机中居然是一堆黑色和白色的碎片,但是这些碎片之中到底会有什么样的宝藏呢? 我去问了欧鹏·曦文同学,他说他有办法恢复拼图原貌,但是前提是要我把真正有用的东西给他。 看来需要恢复图片 用到 winhex...

qq_42777804的博客 2155

百练#2803碎纸机

描述 你现在负责设计一种新式的碎纸机。一般的碎纸机会把纸切成小片,变得难以阅读。而你设计的新式的碎纸机有以下的特点: 1.每次切割之前,先要给定碎纸机一个目标数,而且在每张被送入碎纸机的纸片上也需要包含一个数。 2.碎纸机切出的每个纸片上都包括一个数。 3.要求切出的每个纸片上的数的和要不大于目标数而且与目标数最接近。 举一个例子,如下图,假设目标数是50,输入纸片上的数是12346。碎纸机会把纸...

weixin_38894974的博客 357

竞赛题目讲解-【Japan 2002 Kanazawa】碎纸机

【Japan 2002 Kanazawa】碎纸机 你现在负责设计一种新式的碎纸机。一般的碎纸机会把纸切成小片,变得难以阅读。而你设计的新式的碎纸机有以下的特点:1.每次切割之前,先要给定碎纸机一个目标数,而且在每张被送入碎纸机的纸片上也需要包含一个数。 2.碎纸机切出的每个纸片上都包括一个数。 3.要求切出的每个纸片上的数的和要不大于目标数而且与目标数最接近。

Lucky_Glass的C++之旅 1460

openjudge每日推荐——碎纸机

#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; int ans,num,m,vis[1000005],now[100],step[100],n; char s[100]; void dfs(int pos,int sum,int cnt)//当前位置,

Loi_whales 的坑 463

openjudge 1805 碎纸机

~~~

Loi_cgold 429

1805:碎纸机 oj

怎么说呢,思路一开始就有,就是分成几个块然后加,但水平太弱,很难实现QAQ 选择记录相加的最大上限来限制,其实挺好编的,有个条件是输出方案并且判断会不会有重复,这个。。。 终归有了思路,记录最大值(可以通过上限来求),并判断有没有重复 判重的地方又有了问题,如果在回溯过程中,ans可能会在任何区间改变,关键一步,把判重的东西改成数组。。。就行了 code#include<iostream>

happy 695
上一篇: 洛谷 P1518 两只塔姆沃斯牛
下一篇: CODEVS 1961 躲避大龙(CODEVS200题纪念)
「已注销」
博客等级 码龄11年 31粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值