题目:[HAOI2012]添加号
描述:
【题目描述】
有一个由数字1,2,…9组成的数字串(长度不超过8),问如何将M(M<=5)个加号"+"插入到这个数字串中,使所形成的算术表达式的值最小。请编一个程序解决这个问题。
注意:
加号不能加在数字串的最前面或最末尾,也不应有两个或两个以上的加号相邻。
M保证小于数字串的长度。
例如:数字串79846,若需要加入两个加号,则最佳方案为79+8+46,算术表达式的值133。
【输入格式】
第一行是一个数字串(数字串中间无空格),第二行是一个正整数M。
【输出格式】
所求得的最小和的精确值。
【样例输入】
79846 2
【样例输出】
133
【提示】
全部数据:数字串长度不超过8,M<=7。
30%的数据M=1。
50%数据M<=2。
【来源】
2012年河南省青少年信息学(计算机)奥林匹克赛竞赛(初中组)
此题太水了,直接深搜一遍过,不带剪枝和优化,数据太小了……另外吐槽一下Pascal的过程太坑了,变量必须要清零,让我调了两分钟……
AC代码:
{
program zht; var i,ans,m,c:longint; a:array[0..100] of longint; s:array[0..100] of 0..1; z:ansistring; function min(a,b:longint):longint; begin if a<b then min:=a else min:=b; end; procedure work; var h,k,l:longint; begin l:=0; h:=0; for k:=1 to length(z) do begin l:=l*10+a[k]; if s[k]=1 then begin h:=h+l; l:=0; end; end; h:=h+l; ans:=min(ans,h); end; procedure find; var k:longint; begin if c=m then begin work; exit; end; for k:=1 to length(z)-1 do begin if s[k]=0 then begin s[k]:=1; inc(c); find; dec(c); s[k]:=0; end; end; end; begin assign(input,'purasu.in'); assign(output,'purasu.out'); reset(input); rewrite(output); readln(z); for i:=1 to length(z) do a[i]:=ord(z[i])-48; readln(m); c:=0; ans:=maxlongint; fillchar(s,sizeof(s),0); find; writeln(ans); close(input); close(output); end.
}
<Marvolo原创,严禁转载>