2.2.1 PREFACE NUMBERING 序言页码

http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=2325

题目大意:(如题)

输入输出:(如题)

解题思路:

1.用打表法将每一个数N(1<=N<3500)中间“I”“V”“X”“L”“C”“D”“M”的个数统计出来,用一个二维数组cnt[3500][7]保存起来。

2.枚举。

从千位開始枚举。一直枚举到个位为止,每次推断减掉那个数之后剩下的数是否还不小于0。

假设不小于则继续。反之结束。

3.减小代码的方法。

(1) 10进制数到罗马数字的转换表:

string rec[4][9]={"I","II","III","IV","V","VI","VII","VIII","IX",
      "X","XX","XXX","XL","L","LX","LXX","LXXX","XC",
                  "C","CC","CCC","CD","D","DC","DCC","DCCC","CM",
                  "M","MM","MMM"};

(2) 字符到数组下标的转换表:

char res[7]={‘I‘,‘V‘,‘X‘,‘L‘,‘C‘,‘D‘,‘M‘};

核心代码:

for(mrk=1;mrk<3500;mrk++)
 {
  dat=mrk;
  for(i=3;i>=0;i--)
  {
   for(j=9;j>=1;j--)
   {
    tmp=pow((double)10,(double)i)*j;
    while(dat-tmp>=0)
    {
     dat-=tmp;
     for(k=0;k<rec[i][j-1].length();k++)
     {
      switch(rec[i][j-1][k])
      {
      case ‘I‘:
       cnt[mrk][0]++;
       break;
      case ‘V‘:
       cnt[mrk][1]++;
       break;
      case ‘X‘:
       cnt[mrk][2]++;
       break;
      case ‘L‘:
       cnt[mrk][3]++;
       break;
      case ‘C‘:
       cnt[mrk][4]++;
       break;
      case ‘D‘:
       cnt[mrk][5]++;
       break;
      case ‘M‘:
       cnt[mrk][6]++;
       break;
      default:
       break;
      }
     }
    }
   }
  }
 }

环境恶劣……给力……

时间: 2024-11-01 01:59:46

2.2.1 PREFACE NUMBERING 序言页码的相关文章

USACO:2.2.1 Preface Numbering 序言页码

USACO:2.2.1 Preface Numbering 序言页码 一.题目描述 ★Preface Numbering 序言页码 一类书的序言是以罗马数字标页码的.传统罗马数字用单个字母表示特定的数值,一下是标准数字 表: 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)从不连续出现. 除了下一个规则,一般来说,字符

【USACO 2.2.1】序言页码

[题目描述] 一类书的序言是以罗马数字标页码的.传统罗马数字用单个字母表示特定的数值,以下是标准数字表: 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 有时,一个可表示为

USACO 2.2 Preface Numbering

Preface Numbering A certain book's prefaces are numbered in upper case Roman numerals. Traditional Roman numeral values use a single letter to represent a certain subset of decimal numbers. Here is the standard set: I 1 L 50 M 1000 V 5 C 100 X 10 D 5

USACO Section 2.2 Preface Numbering

/* ID: lucien23 PROG: preface LANG: C++ */ #include <iostream> #include <fstream> #include <string> #include <map> using namespace std; int main() { ifstream infile("preface.in"); ofstream outfile("preface.out")

洛谷 P1465 [USACO2.2]序言页码 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 有时,一个可表示为10

【Preface Numbering】罗马数字

[Problem 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 = 2

USACO Preface Numbering 构造

一开始看到这道题目的时候,感觉好难 还要算出罗马的规则. 但是仔细一看,数据规模很小, n 只给到3500 看完题目给出了几组样例之后就有感觉了 解题方法就是: n的每个十进制数 转换成相应的罗马数字,然后统计每个罗马数字出现的次数即可 还是一道简单的构造题. (以下摘自https://www.byvoid.com/blog/usaco-221preface-numbering/) 转化有以下规则: 1.数较大部分在前,较小部分在后 2.表示10整倍数的字母(I X C M)最多可以累加三次 3

2.2.1 Preface Numbering

数字比较小,所以题目的难点就转到了,阿拉伯数字向罗马数字转化的过程了. 转化也不难.我直接手算了,值得注意的是8的写法VIII(不是IIX). 整体来说不难.只要观察出每一位是相互独立的就行. 具体代码如下: /* ID: awsd1231 PROG: preface LANG: C++ */ #include<iostream> #include<cstdio> #include<vector> #include<map> using namespace

【USACO 2.2】Preface Numbering (找规律)

求 1-n 的所有罗马数字表达中,出现过的每个字母的个数. 分别对每个数的罗马表达式计算每个字母个数. 对于十进制的每一位,都是一样的规则,只是代表的字母不同. 于是我们从最后一位往前考虑,当前位由字母 s[i] 代表 1,字母 s[i+1] 代表 5,s[i+2] 代表 10(在下一次代表1). 每一位考虑完 i+=2; num[i] 为当前位为i对应的 s[i] 的个数,当前位为 4~8 时,s[i+1] 出现 1 次,当前位为 9 时,s[i+2] 出现一次. http://train.u