【提高组NOIP2008】火柴棒等式

题目大意:
给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。
用火柴棍拼数字0-9的拼法如图所示:

这里写图片描述
注意:
1. 加号与等号各自需要两根火柴棍
2. 如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C>=0)
3. n根火柴棍必须全部用上

A、B、C>=0
n<=24

题解:

枚举:
预处理出每个数字要用到的火柴数,枚举所有可能

代码:

const
   num:array [0..9] of longint=(6,2,5,5,4,5,6,3,7,6);
var
   a:array [0..1000] of longint;
   ans,i,j,n:longint;
begin
   assign(input,'matches.in'); reset(input);
   assign(output,'matches.out'); rewrite(output);
   a[0]:=6; a[1]:=2; a[2]:=5; a[3]:=5; a[4]:=4;  ans:=0;
   a[5]:=5; a[6]:=6; a[7]:=3; a[8]:=7; a[9]:=6;  a[1000]:=20;
   readln(n);
    for i:=10 to 99 do a[i]:=a[i div 10]+a[i mod 10];
    for i:=100 to 999 do a[i]:=a[i div 100]+a[i mod 100 div 10]+a[i mod 10];
    for i:=0 to 1000 do
     for j:=0 to 1000 do
      if (i+j<=1000) and (a[i]+a[j]+a[i+j]+4=n) then  inc(ans);
     writeln(ans);
   close(input); close(output);
end.

你可能感兴趣的:(pascal,暴力/枚举/模拟)