【POJ1416】Shredding Company
本题知识点:深度优先搜索 + 回溯
本题题意很简单,就是有一条位数不超过6的数字纸条,问你怎么剪这纸条,使得得到的纸条的值的总和最接近目标值(总和不能超过目标值)。
比如第一个样例
50 12346
12346可以剪成
1 2 3 4 6(总和16);12 34 6(总和52)等,其中最接近且不大于目标值的就是剪成1 2 34 6,总和是43,所以输出
43 1 2 34 6;
如果怎么剪都是大于目标值则输出
error
如果剪法有多种情况则输出
rejected
比如111 33333就有多种不同样的剪法带来相同的总和。
需要注意的是,数据输入保证没有前置0,但中间0也是要算进一种情况的,
比如 6 1104这例子1 1 0 4 与 1 1 04就属于两种不同的情况,但他们的和相等,所以就输出rejected了
那应该怎么剪呢?
我这里的做法是利用dfs的思想,到某一位上就有剪与不剪这种情况。
比如12346这条纸条,当我指到1这个数字上时,我剪下来就是1 2346,不剪就仍是12346,等到指到2时,剪下来就是12 346,如果前面1也剪了话就是 1 2 346了......依次类推,就可以写出dfs的递归过程。
注意回溯/(详细可看代码)
数据不大
// POJ 1416
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int tar, num, Len, ans, minn;
bool ok, take;
int in[102], Ans[102];
int cnt_in, cnt_ans;
void setLen(){ // Len 记录可以剪与不剪的长度
Len = 0;
int q = num;
while(q){ Len++; q /= 10; }
}
void dfs(int r, int len, int tot){ // r:当前纸条 len:判定到第几个数上 tot:剪下后的总和
if(len == Len){ // 判断到最后的数字
tot += r; // 加上最后的r
if(r != 0) // 如果不是 0 要入数组(下面对应)
in[cnt_in++] = r;
if(tot <= tar){ // 先要比目标值小
if(tar-tot < minn){ // 然后找差值最小的
ok = true;
minn = tar - tot;
ans = tot;
for(int i = 0; i < cnt_in; i++) Ans[i] = in[i]; cnt_ans = cnt_in;
take = false; // 更新后就有新的答案数组 take 也要改变
// 数据更新
}
else if(tar - tot == minn) { // 如果是相同的差值 判断是否重复(如果数组元素是一样的则不算)
bool equ = true;
if(cnt_ans == cnt_in){
for(int i = 0; i < cnt_in; i++){
if(Ans[i] != in[i]) {
equ = false;
}
}
}
else equ = false;
if(!equ) take = true;
}
}
if(r != 0)
cnt_in--; // 同样也是回溯
return ;
}
// 记录当前 r 的长度
int q = r, now = 0;
while(q){ now++; q /= 10; }
int pla = len - (Len - now); // 应该往右几位截取数据(这个规则可以自己动手算一算)
int zero = 1;
for(int i = 0; i < Len - len - 1; i++) zero *= 10;
// 该位切
int cro = r / zero; // 被剪下来的数
in[cnt_in++] = cro; // 放进数组里(顺序表思路)
dfs(r % zero, len + 1, tot + cro);
cnt_in--; // 回溯,丢掉
// 该位不切
if(len == Len - 1 && num % 10 == 0 && r == 0) in[cnt_in++] = r; // 特判:判断原字条最后一位是否为0,如果是要入数组(取决于最后判断时的判断条件)
dfs(r, len + 1, tot);
if(len == Len - 1 && num % 10 == 0 && r == 0)cnt_in--; // 对于特判的回溯
}
int main()
{
while(~scanf("%d %d", &tar, &num) && tar + num){
// 初始化工作
memset(in, 0, sizeof(in));
memset(Ans, 0, sizeof(Ans));
cnt_in = cnt_ans = 0;
ok = take = false; // ok 记录有满足的条件 take 记录是否有重复的满足条件
ans = 0;
minn = 0x3f3f3f3f;
setLen();
// 跑程序只是有一个dfs()
dfs(num, 0, 0);
// 答案输出
if(ok && !take) {
printf("%d ", ans);
for(int i = 0; i < cnt_ans; i++)
printf("%d%c", Ans[i], i == cnt_ans - 1 ? '\n' : ' ');
}
else if(ok && take) printf("rejected\n");
else if(!ok) printf("error\n");
}
return 0;
}
【POJ1416】Shredding Company的更多相关文章
- 【CF125E】MST Company(凸优化,最小生成树)
[CF125E]MST Company(凸优化,最小生成树) 题面 洛谷 CF 题解 第一眼看见就给人丽洁姐那道\(tree\)一样的感觉. 那么二分一个权值,加给所有有一个端点是\(1\)的边, 然 ...
- 【POJ 1416】Shredding Company
题 题意 给你一个target number,和一个最多六位的数num,让你把数分段,使总和最接近但不大于target number. 如果只有一种方法就输出总和.分段,如果有多种方法,输出rejec ...
- POJ 1416 Shredding Company【dfs入门】
题目传送门:http://poj.org/problem?id=1416 Shredding Company Time Limit: 1000MS Memory Limit: 10000K Tot ...
- POJ1416——Shredding Company(DFS)
Shredding Company DescriptionYou have just been put in charge of developing a new shredder for the S ...
- 【CodeForces】790 C. Bear and Company 动态规划
[题目]C. Bear and Company [题意]给定大写字母字符串,交换相邻字符代价为1,求最小代价使得字符串不含"VK"子串.n<=75. [算法]动态规划 [题解 ...
- 【lightoj-1039】A Toy Company(BFS)
The toy company "Babies Toys" has hired you to help develop educational toys. The current ...
- poj1416 Shredding Company
Shredding Company Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5379 Accepted: 3023 ...
- 【codeforces 794C】Naming Company
[题目链接]:http://codeforces.com/contest/794/problem/C [题意] 有n个位置; 两个人; 每个人都有n个字符组成的集合s1,s2(可以有重复元素); 然后 ...
- 【VK Cup 2015 - Finals D】Restructuring Company
[题目链接]:http://codeforces.com/problemset/problem/566/D [题意] 给你n个人; 一开始每个人都隶属于一个部门; 之后给你q个操作; 3种操作类型; ...
随机推荐
- @Valid注解的使用springmvc pojo校验
@Valid注解用于校验,所属包为:javax.validation.Valid. ① 首先需要在实体类的相应字段上添加用于充当校验条件的注解,如:@Min,如下代码(age属于User类中的属性): ...
- ASP.NET MVC 允许跨域请求设置
场景:创建一个图片上传的站点,用于其他站点跨域上传附件和图片之类. 上传插件结合百度的 webuploader.js 经常会碰到,跨域的问题,如下, 处理方式呢,是在web.config 中配置允许跨 ...
- 图像上划矩形(cv.line()函数)
在图像上划矩形 import numpy as npimport cv2 as cvimg=np.zeros((400,400),np.uint8)cv.line(img,(100,100),(350 ...
- 详细的Hadoop的入门教程-完全分布模式Fully-Distributed Operation
1. 前面在伪分布模式下已经创建了一台机器,为了统一命名,hostname更名为hadoop01.然后再克隆2台机器:hadoop02. hadoop03:将第一台机器hadoop01上的伪分布停止, ...
- SpringBoot+Security+MyBatis+ES+MQ+Redis+Docker+Vue的电商系统
今天鹏哥给大家推荐的项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现. 前台商城系统包含首页门户.商品推荐.商品搜索.商品展示.购物车.订单流程.会员中 ...
- kbmmw 5.10.10 发布
这个版本主要是bug修正. New stuff ========= - Added OnException event property to TkbmMWSchedu ...
- html中对应Word中的字体和字号
原文链接:https://blog.csdn.net/xuexizhe88/article/details/79277587:https://blog.csdn.net/qq_31603575/art ...
- saas系统多租户数据隔离的实现(一)数据隔离方案
0. 前言 前几天跟朋友聚会的时候,朋友说他们公司准备自己搞一套saas系统,以实现多个第三方平台的业务接入需求.聊完以后,实在手痒难耐,于是花了两天时间自己实现了两个saas系统多租户数据隔离实现方 ...
- pandas的行列显示不全的解决方法
pd.set_option('display.max_rows', 100) # 显示的最大行数(避免只显示部分行数据) pd.set_option('display.max_columns', 10 ...
- Linux 定时任务的控制台导出导入到文件
这个不但适用于定时任务,也适用于一般的脚本. 以前喜欢用>>这样的快捷方式, 今天看到用tee命令的,也记下. 55 23 * * * /bin/sh /sql_bak/restore_s ...