日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P1465 序言页码 Preface Numbering (手推)

發布時間:2023/12/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P1465 序言页码 Preface Numbering (手推) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述
一類書的序言是以羅馬數字標頁碼的。傳統羅馬數字用單個字母表示特定的數值,以下是標準數字表:

I 1 V 5 X 10 L 50 C 100 D 500 M 1000

最多3個同樣的可以表示為10n的數字(I,X,C,M)可以連續放在一起,表示它們的和:

III=3 CCC=300

可表示為5x10n的字符(V,L,D)從不連續出現。

除了下一個規則,一般來說,字符以遞減的順序接連出現:

CCLXVIII = 100+100+50+10+5+1+1+1 = 268

有時,一個可表示為10n的數出現在一個比它大1級或2級的數前(I在V或X前面,X在L或C前面,等等)。在這種情況下,數值等于后面的那個數減去前面的那個數:

IV = 4 IX = 9 XL = 40

一個數 用羅馬數字來表示 有且僅有一種 而且不能復合嵌套使用(比如I是1 X是10 有人可能要說 IXL就能表示50-10-1 但是IXL絕對不能用來表達39 ) (那么39用什么來表示呢 XXXIX是唯一 而且正確的選擇- -)

像XD, IC, 和XM這樣的表達是非法的,因為前面的數比后面的數小太多。對于XD(490的錯誤表達),可以寫成 CDXC; 對于IC(99的錯誤表達),可以寫成XCIX; 對于XM(990的錯誤表達),可以寫成CMXC。 90 寫成 XC 而不是 LXL, 因為 L 后面的 X 意味著后繼標記是 X 或者更小 (不管怎樣,可能吧)(等同于阿拉伯數字 每位 數字分別表示)。

給定N(1 <= N < 3,500), 序言的頁碼數,請統計在第1頁到第N頁中,有幾個I出現,幾個V出現,等等 (從小到大的順序)。不要輸出沒有出現過的字符。

比如N = 5, 那么頁碼數為: I, II, III, IV, V. 總共有7個I出現,2個V出現。

輸入輸出格式
輸入格式:
一個整數N。

輸出格式:
每行一個字符和一個數字k,表示這個字符出現了k次。字符必須按數字表中的遞增順序輸出。

輸入輸出樣例
輸入樣例#1:
5
輸出樣例#1:
I 7
V 2
說明
翻譯來自NOCOW

USACO 2.2
這個題他們使用DP做的,我看了看一開始也想DP后來發現,他們有規律,就手推前一部分,然后就比較好理解了,不推薦我的做法,這是一道DP題,這是投機取巧的做法。

#include <bits/stdc++.h> using namespace std; int n; int i[20],v[20],x[20],l[20],c[20],d[20],m[20],A[20]; int ansi,ansv,ansx,ansl,ansc,ansd,ansm; void add(int b,int num){ansi+=i[b]*num;ansv+=v[b]*num;ansx+=x[b]*num;ansl+=l[b]*num;ansc+=c[b]*num;ansd+=d[b]*num;ansm+=m[b]*num;return; } int main() {cin>>n;A[1]=1;i[1]=1;A[2]=4;i[2]=1;v[2]=1;A[3]=5;v[3]=1;A[4]=9;i[4]=1;x[4]=1;A[5]=10;x[5]=1;A[6]=40;x[6]=1;l[6]=1;A[7]=50;l[7]=1;A[8]=90;x[8]=1;c[8]=1;A[9]=100;c[9]=1;A[10]=400;c[10]=1;d[10]=1;A[11]=500;d[11]=1;A[12]=900;c[12]=1;m[12]=1;A[13]=1000;m[13]=1;for (int j=1;j<=n;j++){int temp=j,now=13;while (temp){while (temp<A[now]) now--;add(now,temp/A[now]);temp%=A[now];}}if (ansi!=0) cout<<"I "<<ansi<<endl;if (ansv!=0) cout<<"V "<<ansv<<endl;if (ansx!=0) cout<<"X "<<ansx<<endl;if (ansl!=0) cout<<"L "<<ansl<<endl;if (ansc!=0) cout<<"C "<<ansc<<endl;if (ansd!=0) cout<<"D "<<ansd<<endl;if (ansm!=0) cout<<"M "<<ansm<<endl;return 0; }

總結

以上是生活随笔為你收集整理的P1465 序言页码 Preface Numbering (手推)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。