題目描述
一類書的序言是以羅馬數字標頁碼的。傳統羅馬數字用單個字母表示特定的數值,一下是標準數字表:
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出現。
輸入乙個整數n。
輸出每行乙個字元和乙個數字k,表示這個字元出現了k次。字元必須按數字表中的遞增順序輸出。
樣例輸入
樣例輸出
i 7v 2
題意分析:這道題不要誤以為只輸出i和v,其次就是輸出的順序是按給定的字元所代表的數字大小按從小到大輸出的
解題思路:就是純思維模擬,不過還是有點規律的自己列乙個從1到9所代表的序言頁碼,然後在列乙個10 20 30 40 50 60 70 80 90的序言頁碼,在列一行100 200 300 400 500 600 700 800 900對應的序言頁碼就會找到一點規律。
#include
#include
#include
using namespace std;
int a[2]
[10]=
,};int
main()
else
j=k1;
if(j>=
100&&j<
1000
)
m['i']
+=a[0]
[j%10];
m['v']
+=a[1]
[j%10];
if(j>=
10&&j<
100)
if(j==9)
m['x']++;
if(j==90)
m['c']++;
if(i==
900||i==
1999
||i==
2900
)//這幾個數是需要自己慢慢算出來的
m['m']++;
}for
(i=1
;i<=
7;i++)}
return0;
}
USACO2 2 1 序言頁碼
這題還是挺有意思的 但是會發現,其實每一位的情況都是一樣的,只需要考慮個位的0,1,2,3,4,5,6,7,8,9的情況下,1,5,10的使用情況。然後在兩位數的時候,十位的情況其實和個位一樣,只不過類推到10 50 100的使用上而已。兩位數的個位,依然和個位數的個位情況完全一樣。所以這道題就成了...
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 可表...
HNOJ 121580 純思維題
題目的意思就是乙個金額.並給出每個人可以獲得得最大額.問怎麼分配能最平均.其中題目有指出.數字大的盡量要多分配.數字一樣大的.序列在前的多分配.今天湖大網賽的一道題.一上來就水掉了.覺得思維也不夠嚴謹 但就是這樣過了.我的思路就是首先每個人排序 以最大額從小到大.如果最大額一樣序列再從大到小排.然後...