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");
	if(!infile || !outfile)
	{
		cout << "file operation failure!" << endl;
		return -1;
	}

	int N;
	infile >> N;

	map<int, string> romans;
	romans.insert(pair<int, string>(1, "I"));
	romans.insert(pair<int, string>(2, "II"));
	romans.insert(pair<int, string>(3, "III"));
	romans.insert(pair<int, string>(4, "IV"));
	romans.insert(pair<int, string>(5, "V"));
	romans.insert(pair<int, string>(6, "VI"));
	romans.insert(pair<int, string>(7, "VII"));
	romans.insert(pair<int, string>(8, "VIII"));
	romans.insert(pair<int, string>(9, "IX"));

	romans.insert(pair<int, string>(10, "X"));
	romans.insert(pair<int, string>(20, "XX"));
	romans.insert(pair<int, string>(30, "XXX"));
	romans.insert(pair<int, string>(40, "XL"));
	romans.insert(pair<int, string>(50, "L"));
	romans.insert(pair<int, string>(60, "LX"));
	romans.insert(pair<int, string>(70, "LXX"));
	romans.insert(pair<int, string>(80, "LXXX"));
	romans.insert(pair<int, string>(90, "XC"));

	romans.insert(pair<int, string>(100, "C"));
	romans.insert(pair<int, string>(200, "CC"));
	romans.insert(pair<int, string>(300, "CCC"));
	romans.insert(pair<int, string>(400, "CD"));
	romans.insert(pair<int, string>(500, "D"));
	romans.insert(pair<int, string>(600, "DC"));
	romans.insert(pair<int, string>(700, "DCC"));
	romans.insert(pair<int, string>(800, "DCCC"));
	romans.insert(pair<int, string>(900, "CM"));

	romans.insert(pair<int, string>(1000, "M"));
	romans.insert(pair<int, string>(2000, "MM"));
	romans.insert(pair<int, string>(3000, "MMM"));

	map<char, int> letters;
	letters['I'] = 0;
	letters['V'] = 0;
	letters['X'] = 0;
	letters['L'] = 0;
	letters['C'] = 0;
	letters['D'] = 0;
	letters['M'] = 0;
	string strBase = "IVXLCDM";

	for (int i=1; i<=N; i++)
	{
		int temp = i;
		string str = "";
		if (temp >= 1000)
		{
			str += romans.at(temp / 1000 * 1000);
			temp %= 1000;
		}

		if (temp >= 100)
		{
			str += romans.at(temp / 100 * 100);
			temp %= 100;
		}

		if (temp >= 10)
		{
			str += romans.at(temp / 10 * 10);
			temp %= 10;
		}

		if (temp >= 1)
		{
			str += romans.at(temp);
		}

		int len = str.size();
		for (int j=0; j<len; j++)
		{
			int count = letters.at(str[j]);
			letters[str[j]] = count + 1;
		}
	}

	int len = strBase.size();
	for (int i=0; i<len; i++)
	{
		int count = letters.at(strBase[i]);
		if (count > 0)
		{
			outfile << strBase[i] << " " << count << endl;
		}
	}

	return 0;
}

USACO Section 2.2 Preface Numbering

时间: 2024-12-27 21:54:34

USACO Section 2.2 Preface Numbering的相关文章

USACO Section 2.1: Preface Numbering

看网上的,太琐碎 1 /* 2 ID: yingzho2 3 PROG: preface 4 LANG: C++ 5 */ 6 #include <iostream> 7 #include <fstream> 8 #include <string> 9 #include <map> 10 #include <vector> 11 #include <set> 12 #include <algorithm> 13 #incl

【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

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 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.1 Healthy Holsteins

/* ID: lucien23 PROG: holstein LANG: C++ */ #include <iostream> #include <fstream> #include <vector> using namespace std; bool compFun(int x, int y) { int temp, i = 0; while (true) { temp = 1 << i; if (temp&x > temp&y) {

USACO Section 2.2 Party Lamps

/* ID: lucien23 PROG: lamps LANG: C++ */ /* * 此题的技巧之处就是需要注意到任何button只要按下2的倍数次就相当于没有按 * 所以其实只需要考虑4个按钮,每个按钮是否被有效按下过一次就好 * 直接使用枚举法,一共只有2^4=16种情况 * 对于每种情况需要知道被按下的有效次数(也就是被按下过的按钮数),必须满足 * (C-有效次数)%2=0才行,这样其他次数才能视为无效 * 然后验证各种情况是否符合要求,将符合要求的情况按序输出即可 */ #inc

USACO Section 2.2 Runaround Numbers

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

USACO Preface Numbering 构造

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

usaco Preface Numbering

题目算法不难,难的是读懂题意,意思是从1到N的数字转换成罗马数字,然后统计所有数字中的各种字母出现的次数 对于每个数,用贪心的方法转换为罗马数字,然后统计就好了 /* ID: modengd1 PROG: preface LANG: C++ */ #include <iostream> #include <stdio.h> #include <memory.h> #include <string> #include <cstring> using