博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
USACO 2.2 序言页码 (MATH)
阅读量:5263 次
发布时间:2019-06-14

本文共 2272 字,大约阅读时间需要 7 分钟。

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: zyx52yzlLANG: PASCALTASK: 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

你可能感兴趣的文章
代码变量、函数命名神奇网站
查看>>
redis cli命令
查看>>
Problem B: 占点游戏
查看>>
python常用模块之sys, os, random
查看>>
HDU 2548 A strange lift
查看>>
Linux服务器在外地,如何用eclipse连接hdfs
查看>>
react双组件传值和传参
查看>>
[Kaggle] Sentiment Analysis on Movie Reviews
查看>>
价值观
查看>>
mongodb命令----批量更改文档字段名
查看>>
MacOS copy图标shell脚本
查看>>
国外常见互联网盈利创新模式
查看>>
Oracle-05
查看>>
linux grep 搜索查找
查看>>
Not enough free disk space on disk '/boot'(转载)
查看>>
android 签名
查看>>
android:scaleType属性
查看>>
SuperEPC
查看>>
mysql-5.7 innodb 的并行任务调度详解
查看>>
shell脚本
查看>>