USACO 2.2 序言页码 (MATH)

Description

一类书的序言是以罗马数字标页码的。传统罗马数字用单个字母表示特定的数值,一下是标准数字表:
I 1 L 50 M 1000
V 5 C 100
X 10 D 500
最多3个可以表示为10n的数字(I,X,C,M)可以连续放在一起,表示它们的和:
III=3
CCC=300
可表示为5x10n的字符(V,L,D)从不连续出现。
除了下一个规则,一般来说,字符以递减的顺序接连出现:
CCLXVIII = 100+100+50+10+5+1+1+1 = 268
有时,一个可表示为10^n的数出现在一个比它大的数前(I在V或X前面,X在L或C前面,等等)。在这种情况下,数值等于后面的那个数减去前面的那个数:
IV = 4
IX = 9
XL = 40
像XD, IC, 和XM这样的表达是非法的,因为前面的数比后面的数小太多。对于XD(490的错误表达),可以写成 CDXC; 对于IC(99的错误表达),可以写成XCIX; 对于XM(990的错误表达),可以写成CMXC。
给定N(1 <= N < 3,500), 序言的页码数,请统计在第1页到第N也中,有几个I出现,几个V出现,等等 (从小到大的顺序)。不要输出并没有出现过的字符。
比如N = 5, 那么页码数为: I, II, III, IV, V. 总共有7个I出现,2个V出现。

Input

一个整数N。

Output

每行一个字符和一个数字k,表示这个字符出现了k次。字符必须按数字表中的递增顺序输出。

题解

暴力出正解。
Executing...
   Test 1: TEST OK [0.000 secs, 340 KB]
   Test 2: TEST OK [0.000 secs, 340 KB]
   Test 3: TEST OK [0.000 secs, 340 KB]
   Test 4: TEST OK [0.000 secs, 340 KB]
   Test 5: TEST OK [0.000 secs, 340 KB]
   Test 6: TEST OK [0.000 secs, 340 KB]
   Test 7: TEST OK [0.000 secs, 340 KB]
   Test 8: TEST OK [0.000 secs, 340 KB]
All tests OK.

代码

{
ID: zyx52yzl
LANG: PASCAL
TASK: preface
}
var
 i,v,x,l,c,d,m,n,k:longint;
procedure print;
begin
  if i<>0 then writeln('I ',i);
  if v<>0 then writeln('V ',v);
  if x<>0 then writeln('X ',x);
  if l<>0 then writeln('L ',l);
  if c<>0 then writeln('C ',c);
  if d<>0 then writeln('D ',d);
  if m<>0 then writeln('M ',m);
end;

procedure main;
var
  ii:longint;
begin
  for ii:=1 to n do
    begin
      k:=ii;
      while k>0 do
        case k of
          1..3:begin i:=i+1; k:=k-1; end;
          4:begin k:=k-4; i:=i+1; v:=v+1; end;
          5..8:begin k:=k-5; v:=v+1; end;
          9:begin k:=k-9; i:=i+1; x:=x+1; end;
          10..39:begin k:=k-10; x:=x+1; end;
          40..49:begin k:=k-40; l:=l+1; x:=x+1; end;
          50..89:begin k:=k-50; l:=l+1; end;
          90..99:begin k:=k-90; x:=x+1; c:=c+1; end;
          100..399:begin k:=k-100; c:=c+1; end;
          400..499:begin k:=k-400; d:=d+1; c:=c+1; end;
          500..899:begin k:=k-500; d:=d+1; end;
          900..999:begin k:=k-900; m:=m+1; c:=c+1; end;
          else begin k:=k-1000; m:=m+1; end;
        end;
    end;
end;

begin
  assign(input,'preface.in');
  assign(output,'preface.out');
  reset(input);
  rewrite(output);
  readln(n);
  main;
  print;
  close(input);
  close(output);
end.

原文地址:https://www.cnblogs.com/zyx-crying/p/9319559.html