`
qingtangpaomian
  • 浏览: 39108 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

USACO - 1.2.3 - Name That Number

 
阅读更多

 

转载请注明出处

摘要 : HASH

一. 题目翻译

1. 描述:
          在威斯康辛州牛大农场经营者之中,都习惯于请会计部门用连续数字给母牛打上烙印。但是,母牛用手机时并没感到这个系统的便利,它们更喜欢用它们喜欢的名字来呼叫它们的同伴,而不是用像这个的语句"C'mon, #4734, get along."。请写一个程序来帮助可怜的牧牛工将一只母牛的烙印编号翻译成一个可能的名字。因为母牛们现在都有手机了,使用那标准的按键的排布来把将数目翻译为文字:( 除了 "Q" 和 "Z")
           2: A,B,C     5: J,K,L    8: T,U,V
        3: D,E,F     6: M,N,O    9: W,X,Y
        4: G,H,I     7: P,R,S
        可接受的名字都被放在这样一个叫作"dict.txt" 的文件中,它包含一连串的少于 5,000个(准确地说是4617个)可被接受的牛的名字。 (所有的名字都是大写的且已按字典序排列) 请读入母牛的编号并返回那些能从编号翻译出来并且在字典中的名字。举例来说,编号 4734 能产生的下列各项名字: GPDG GPDH GPDI GPEG GPEH GPEI GPFG GPFH GPFI GRDG GRDH GRDI GREG GREH GREI GRFG GRFH GRFI GSDG GSDH GSDI GSEG GSEH GSEI GSFG GSFH GSFI HPDG HPDH HPDI HPEG HPEH HPEI HPFG HPFH HPFI HRDG HRDH HRDI HREG HREH HREI HRFG HRFH HRFI HSDG HSDH HSDI HSEG HSEH HSEI HSFG HSFH HSFI IPDG IPDH IPDI IPEG IPEH IPEI IPFG IPFH IPFI IRDG IRDH IRDI IREG IREH IREI IRFG IRFH IRFI ISDG ISDH ISDI ISEG ISEH ISEI ISFG ISFH ISFI
         碰巧,81个中只有一个"GREG"是有效的(在字典中)。
         写一个程序来对给出的编号打印出所有的有效名字,如果没有则输出NONE。编号可能有12位数字。

2. 格式:

          PROGRAM NAME: namenum

          INPUT FORMAT:

          (file namenum.in)

          单独的一行包含一个编号(长度可能从1到12)。

          (file dict.txt)

          http://ace.delos.com/usaco/namenumdict.txt

          OUTPUT FORMAT:

          (file namenum.out)

          以字典顺序输出一个有效名字的不重复列表,一行一个名字。 如果没有有效名字,输出'NONE'。

3. SAMPLE:
          SAMPLE INPUT:
          4734 
          SAMPLE OUTPUT:
          GREG

二.  题解
1. 题意理解(将问题分析清楚,大致用什么思路):
          对于题目中给出的字典(dict.txt)反向建立一个HashMap(key是数字组合;value是该数字组合对应的、在字典中的字符串,如果有多个字符串则用逗号分隔)。
          有了这个HashMap之后,直接将输入的数字组合作为key在HashMap中查找在字典中的字符串,然后输出,如果有多个按逗号分隔的,则每行输出一个值。

2. 具体实现(具体实现过程中出现的问题):
          看了前面的分析,可以发现这道题目的重点在于能够通过字典(dict.txt)反向建立这个HashMap(代码中的getKey方法)。
          其实也比较简单,就是遍历字典中的每个字符串(string),对于字符串string中的每一个字符确定对应于哪个数字(eg:A对应2),然后将所有字符对应的数字组合成一个长整形返回(eg:输入ADG,返回234)

3. 启示:
          其实还有一种思路就是直接暴力求出输入数字能产生的所有字符串(3^12种),然后去字典当中查找(log5000)。这种想法的复杂度是3^12*log5000。
          文中所述的方法时间复杂度是12*5000,较上述方法有所优化。

三.  代码
package session_1_2_3;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Scanner;

public class namenum {

	/**
	 * @param args
	 */
	// 注意越界问题, int - long
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			Scanner in1 = new Scanner(new BufferedReader(new FileReader("F:\\UCASO\\temp\\dict.txt")));
			Scanner in2 = new Scanner(new BufferedReader(new FileReader("F:\\UCASO\\temp\\namenum.in")));
			PrintWriter pw = new PrintWriter(new FileWriter("F:\\UCASO\\temp\\namenum.out"));
			
			HashMap<Long, String> dict = new HashMap<Long, String>();
			while (in1.hasNextLine()){
				String value = in1.nextLine();
				long key = getKey(value);
				if (dict.containsKey(key)){
					String oldValue = dict.get(key);
					dict.put(key, oldValue+","+value);
				} else {
					dict.put(key, value);
				}
			}

			long input = Long.parseLong(in2.nextLine());
			
			if (dict.containsKey(input)){
				String temp = dict.get(input);
				String[] out = temp.split(",");
				for (int i=0;i<out.length;i++){
					pw.println(out[i]);
				}
			} else {
				pw.println("NONE");
			}
			
			pw.close();
			in2.close();
			in1.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}
	
	public static long getKey (String value){
		long key = 0;
		for (int i=0;i<value.length();i++){
			char c = value.charAt(i);
			if (c>='A'&&c<='C'){
				key = 10*key + 2;
			} else if (c>='D'&&c<='F'){
				key = 10*key + 3;
			} else if (c>='G'&&c<='I'){
				key = 10*key + 4;
			} else if (c>='J'&&c<='L'){
				key = 10*key + 5;
			} else if (c>='M'&&c<='O'){
				key = 10*key + 6;
			} else if (c>='P'&&c<='S'){
				key = 10*key + 7;
			} else if (c>='T'&&c<='V'){
				key = 10*key + 8;
			} else if (c>='W'&&c<='Y'){
				key = 10*key + 9;
			} else {
				//do nothing
			}
		}
		return key;
	}

}
 



0
0
分享到:
评论

相关推荐

    USACO答案name that number

    USACO答案,采用C++写的,题目是:name that number.

    USACO-Bessie-Come-Home.zip_Home Home

    【标题】USACO-Bessie-Come-Home.zip_Home Home 【正文】 这个压缩包文件中的内容是关于USACO(美国计算机奥林匹克)竞赛中一个名为"Bessie Come Home"的问题的C++解决方案。USACO是一个针对高中生的在线编程竞赛...

    USACO-beads.rar_usaco bea

    【标题】USACO-beads.rar_usaco bea 【正文】 USACO(美国计算机奥林匹克竞赛)是一项针对中学生举办的编程比赛,旨在培养和选拔未来的计算机科学家。在这个特定的题目"beads"中,我们需要解决的问题是找到最长的...

    USACO-Magic-Squares.zip_magic

    《USACO魔法方阵:C++编程解析》 USACO(美国计算机奥林匹克)是一项旨在培养高中生计算机科学技能的竞赛。在这个问题中,我们关注的是“Magic Squares”,这是一个经典的数学概念,与C++编程相结合,构成了一个...

    USACO-Chapter2.rar_beginners

    "USACO-Chapter2.rar_beginners" 是针对USACO第二章内容的压缩包,特别适合编程新手入门。 在USACO的第二章,主要涉及基础的算法和数据结构,这对于构建扎实的编程基础至关重要。让我们逐一解析这个压缩包中的四个...

    USACO-Chapter1.rar_it_usaco

    《USACO入门指南——第一章解析》 USACO,全称USA Computing Olympiad,是美国计算机奥林匹克竞赛,旨在培养中学生在算法和编程方面的技能。对于初学者来说,USACO提供了很好的学习路径和挑战。本文将针对USACO的第...

    usaco-1.rar_barn1

    【标题】"usaco-1.rar_barn1" 涉及的是USACO(美国计算机奥林匹克)竞赛中的一道编程题目,名为“Barn1”。USACO是一个旨在提升中学生计算机科学技能的比赛,主要关注算法和编程。在本题中,参赛者需要解决与农业或...

    USACO-Greedy-Gift-Givers.rar_greedy gift givers

    USACO(USA Computing Olympiad)是一项面向美国高中生的在线编程竞赛,旨在培养参赛者的算法设计和编程技能。在"Greedy Gift Givers"这个题目中,我们面对的是一个贪心算法的应用问题。贪心算法是一种解决问题的...

    USACO2001-2007历年月赛测试数据+题目+题解打包全

    资源包包括USACO 2001-2007年月赛的测试数据;usaco月赛十年题典(2000-2009),usaco月赛2002-2008题解。单独下载需资源分30分以上。为了方便编程爱好者,我这边统一下载打包。欢迎下载。

    USACO-Training-Website:我的USACO培训网站解决方案

    这个名为"USACO-Training-Website:我的USACO培训网站解决方案"的压缩包文件,显然包含了作者对USACO训练网站上部分或所有章节的练习题目的解答。这些解答可能以源代码的形式存在,每个文件顶部可能带有详细的USACO...

    USACO题目Name That Number (namenum)及代码解析

    【Title】: USACO题目"Name That Number (namenum)"及代码解析 【Description】: 本题属于USACO竞赛中的一道题目,要求编写一个程序,将母牛的烙印编号转换为可能的牛名。这些名字是根据特定的数字到字母的映射规则...

    USACO-Practice:USACO 实践

    这个"USACO-Practice"压缩包文件显然是为了帮助参赛者或者对算法有兴趣的学生准备的实践资源。以下我们将深入探讨USACO竞赛的相关知识点以及可能在压缩包中包含的编程内容。 1. **基础算法**:USACO竞赛通常会涉及...

    USACO-Training-Pages:美国计算机奥林匹克训练页

    在这个“USACO-Training-Pages”压缩包中,我们可以期待找到与USACO竞赛相关的各种资料,尤其是针对Java语言的学习材料。Java作为一种广泛应用于计算机科学领域的面向对象的编程语言,因其强大的跨平台能力和简洁的...

    usaco 2010-2011

    ### USACO 2010-2011 季度竞赛概览与关键信息 #### 一、概述 美国计算机奥林匹克(USACO)是面向全球中学生的计算机科学竞赛,旨在发掘并培养计算机科学领域的年轻人才。USACO 2010-2011 季度竞赛于 2010 年 11 月...

    USACO2001-2007月赛全集

    这是USACO2001-2007月赛全集。 usaco是美国中学生的官方竞赛网站。是美国著名在线题库,专门为信息学竞赛选手准备。推荐直接阅读英语原文,既准确可靠又可提高英语水平。做题方式模拟正式比赛,采用标准测评机、文件...

    Notes-USACO-2021-弹簧

    本压缩包“Notes-USACO-2021-Spring”中的笔记主要聚焦于2021年春季训练营和比赛的知识点,对于想要深入学习算法和提升编程能力的爱好者来说,具有极高的学习价值。 笔记内容可能包括但不限于以下几个方面: 1. **...

    C-Usaco-Work:Usaco在C中的工作

    "C-Usaco-Work"指的是一个针对Usaco(美国计算机奥林匹克)教程的项目,这个项目专门用于帮助参赛者学习如何在C语言环境下进行竞赛编程。Usaco是一项面向高中生的国际性计算机科学竞赛,旨在提高参赛者的算法设计、...

    usaco-java-gold

    在这个“usaco-java-gold”主题中,我们将深入探讨Java在USACO黄金级别比赛中的应用,以及如何解决相关问题。 一、Java语言基础 1. 类与对象:Java是一种面向对象的语言,理解和熟练运用类和对象是解决USACO问题的...

    USACO-Cpp

    【USACO-Cpp】是针对USACO(美国计算机奥林匹克竞赛)的C++编程教程资源,主要面向参赛者提供C++语言的学习材料,帮助他们在比赛中解决算法和数据结构问题。USACO是一项旨在提升高中生计算机科学技能的比赛,强调...

    USACO题解+程序

    我的USACO题解和程序

Global site tag (gtag.js) - Google Analytics