poj1416 Shredding Company
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 5379 | Accepted: 3023 |
Description
1.The shredder takes as input a target number and a sheet of paper with a number written on it.
2.It shreds (or cuts) the sheet into pieces each of which has one or more digits on it.
3.The sum of the numbers written on each piece is the closest possible number to the target number, without going over it.
For example, suppose that the target number is 50, and the sheet of paper has the number 12346. The shredder would cut the sheet into four pieces, where one piece has 1, another has 2, the third has 34, and the fourth has 6. This is because their sum 43 (=
1 + 2 + 34 + 6) is closest to the target number 50 of all possible combinations without going over 50. For example, a combination where the pieces are 1, 23, 4, and 6 is not valid, because the sum of this combination 34 (= 1 + 23 + 4 + 6) is less than the
above combination's 43. The combination of 12, 34, and 6 is not valid either, because the sum 52 (= 12 + 34 + 6) is greater than the target number of 50.
Figure 1. Shredding a sheet of paper having the number 12346 when the target number is 50
There are also three special rules :
1.If the target number is the same as the number on the sheet of paper, then the paper is not cut.
For example, if the target number is 100 and the number on the sheet of paper is also 100, then
the paper is not cut.
2.If it is not possible to make any combination whose sum is less than or equal to the target number, then error is printed on a display. For example, if the target number is 1 and the number on the sheet of paper is 123, it is not possible to make any valid
combination, as the combination with the smallest possible sum is 1, 2, 3. The sum for this combination is 6, which is greater than the target number, and thus error is printed.
3.If there is more than one possible combination where the sum is closest to the target number without going over it, then rejected is printed on a display. For example, if the target number is 15, and the number on the sheet of paper is 111, then there are
two possible combinations with the highest possible sum of 12: (a) 1 and 11 and (b) 11 and 1; thus rejected is printed. In order to develop such a shredder, you have decided to first make a simple program that would simulate the above characteristics and rules.
Given two numbers, where the first is the target number and the second is the number on the sheet of paper to be shredded, you need to figure out how the shredder should "cut up" the second number.
Input
tl num1
t2 num2
...
tn numn
0 0
Each test case consists of the following two positive integers, which are separated by one space : (1) the first integer (ti above) is the target number, (2) the second integer (numi above) is the number that is on the paper to be shredded.
Neither integers may have a 0 as the first digit, e.g., 123 is allowed but 0123 is not. You may assume that both integers are at most 6 digits in length. A line consisting of two zeros signals the end of the input.
Output
sum part1 part2 ...
rejected
error
In the first type, partj and sum have the following meaning :
1.Each partj is a number on one piece of shredded paper. The order of partj corresponds to the order of the original digits on the sheet of paper.
2.sum is the sum of the numbers after being shredded, i.e., sum = part1 + part2 +...
Each number should be separated by one space.
The message error is printed if it is not possible to make any combination, and rejected if there is
more than one possible combination.
No extra characters including spaces are allowed at the beginning of each line, nor at the end of each line.
Sample Input
50 12346
376 144139
927438 927438
18 3312
9 3142
25 1299
111 33333
103 862150
6 1104
0 0
Sample Output
43 1 2 34 6
283 144 139
927438 927438
18 3 3 12
error
21 1 2 9 9
rejected
103 86 2 15 0
rejected
Source
题目大意如下:给定你一个目标数字以及一张数字纸片,需要设计一种切割纸片的程序,使各个切片上数字之和加起来最接近目标数字且不超过它。额外地,有二个条件(话说那个相等条件似乎没用):其一,如果有多个得到最优解的切割方案,则输出"rejected";其二,若求不出合法解,那么输出"error"。
题解如下:由于原题描述用的是中式英语看不大懂,只好抄程序理解。主要思路是预处理求出任意区间代表的数字,从左到右一个一个地按顺序搜索区间,并记录路径,最后递归求解。详细的看我的程序注释吧。
15809294
ksq2013 | 1416 | Accepted | 700K | 16MS | G++ | 1510B | 2016-07-25 21:11:48 |
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
bool more;
pair<int,int>pre[10][10],ans;
int lim,ln,d[10],num[10][10],minn;
void Init(char *p)
{
ln=strlen(p);
for(int i=0;i<ln;i++)
d[i]=p[i]-'0';
}
void Prep()//预处理程序;
{
memset(num,0,sizeof(num));
for(int i=0;i<ln;i++)
for(int j=i;j<ln;j++)
for(int k=i;k<=j;k++)
num[i][j]=num[i][j]*10+d[k];
}
bool dfs(int l,int r,int cnt)
{
if(r>=ln){
if(cnt>minn&&cnt<=lim){
more=false;
ans.first=l;
ans.second=r-1;//对应下方output函数的递归结束条件,非常巧妙的方法,避开了'0'这一特殊数字;
minn=cnt;
return true;
}
else if(cnt==minn)more=true;//多解了!;
return false;
}
bool adv=false;//advanced,记录该搜索子树的节点是否有解;
for(int i=1;i<=ln-r;i++){//看到i<=ln-r可知,i这里枚举的是准备切割区间的长度,例如(0,0)长度为1;
int now=r+i-1;
if(dfs(r,r+i,cnt+num[r][now])){
pre[r][now].first=l;
pre[r][now].second=r-1;
adv=true;
}
}
return adv;
}
void output(int l,int r)
{
if(l<0&&r<0)return;//对应上方dfs中的pre的存储方式,存的是r-1,所以最先前的区间的pre存的l和r都是-1,成为结束递归的条件;
output(pre[l][r].first,pre[l][r].second);
printf("%d ",num[l][r]);//直接按对应的l和r输出区间代表的数字;
}
int main()
{
char p[10];
while(~scanf("%d%s",&lim,p)){
if(!lim)break;
Init(p);
Prep();
more=false,minn=-1;
dfs(-1,0,0);
if(more){
puts("rejected");
continue;
}
if(minn==-1){
puts("error");
continue;
}
printf("%d ",minn);
output(ans.first,ans.second);//我试着用pair作为函数变量,但是不行,因为pre就是用l和r存的,所以只能代入first和second;
putchar('\n');
}
return 0;
}
poj1416 Shredding Company的更多相关文章
- POJ1416——Shredding Company(DFS)
Shredding Company DescriptionYou have just been put in charge of developing a new shredder for the S ...
- POJ1416 Shredding Company(dfs)
题目链接. 分析: 这题从早上调到现在.也不算太麻烦,细节吧. 每个数字都只有两种状态,加入前一序列和不加入前一序列.DFS枚举. #include <iostream> #include ...
- 搜索+剪枝 POJ 1416 Shredding Company
POJ 1416 Shredding Company Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5231 Accep ...
- Shredding Company
Shredding Company Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4653 Accepted: 2675 Des ...
- Shredding Company(dfs)
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3519 Accepted: 2009 Description You h ...
- POJ 1416 Shredding Company【dfs入门】
题目传送门:http://poj.org/problem?id=1416 Shredding Company Time Limit: 1000MS Memory Limit: 10000K Tot ...
- POJ 1416 Shredding Company 回溯搜索 DFS
Shredding Company Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6173 Accepted: 3361 ...
- Shredding Company (hdu 1539 dfs)
Shredding Company Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- POJ 1416:Shredding Company
Shredding Company Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4713 Accepted: 2714 ...
随机推荐
- SharePoint 2010 站点附加数据升级到SP2013
首先,去SharePoint 2010的数据库服务器上,找到站点的数据库,备份.还原到SharePoint 2013环境中: 如果不知道数据库服务器是哪台,可以通过服务器场上的服务器查看: 如果不知道 ...
- 为Autodesk Viewer添加自定义工具条
如果你参加过我们近期的活动,你就会频繁的听到我们现在正在做的Autodesk Viewer大模型浏览器,这是一个不需要下载任何插件,基于WebGL技术的浏览器,可以支持几十种数据格式.同时viewer ...
- Autodesk招聘开发咨询顾问(北京或上海),需要内推的扔简历过来啊
Autodesk现招聘两位二次开发技术顾问,为正式编制.享受所有Autodesk优越的福利资源(额外商业保险,公积金全部由公司支付,年度奖金,季度礼物, 节日礼物, 15天年假,不定期的培训...). ...
- 墙内下载DropBox离线安装包的方法
让你的浏览器FQ,然后进入官网,点击下载,你会看到这个网页: 现在,只需要在原下载的链接后加上“&full=1”即可.就像这样: https://www.dropbox.com/downloa ...
- 微信小程序(应用号)开发资源汇总整理 - 一直更新中
开源项目 wechat-weapp-gank - 微信小程序版Gank客户端 wechat-dribbble - 微信小程序-Dribbble wechatApp-demo - 微信小程序 DEMO ...
- 交换两个变量的值swap(a,b)
方法一:使用第三方变量 , b = , temp; temp = a; a = b; b = temp; 方法二:变量加减法(即121,加减减) , b = ; a = a + b; b = a - ...
- iOS 打电话、发短信、邮件、打开网址、调用应用等合集
iOS中的很多功能都是非常简单的,几行代码就搞定了,比如打电话.打开网址.发邮件.发短信等,这里总结几个比较常用的: 1.打电话 方式一:最简单最直接的方式:直接跳到拨号界面 NSURL *url = ...
- iOS本地推送与远程推送
原文在此 分为本地推送和远程推送2种.可以在应用没有打开甚至手机锁屏情况下给用户以提示.它们都需要注册,注册后系统会弹出提示框(如下图)提示用户是否同意,如果同意则正常使用:如果用户不同意则下次打开程 ...
- UIScrollView之轮转图片
在iOS开发中,经常会在APP首页看到多张图片进行轮换.刚开始做的时候,感觉很麻烦,不是很好做,查阅资料后,我总结了一下,自己封装了一个简单的轮转图片库: UIScrollView无限滑动 ,只需要三 ...
- GCD中的dispatch_barrier_async函数的使用(栅栏函数)
<一>什么是dispatch_barrier_async函数 毫无疑问,dispatch_barrier_async函数的作用与barrier的意思相同,在进程管理中起到一个栅栏的作用,它 ...