- 浏览: 37630 次
- 性别:
- 来自: 北京
最新评论
-
andyshar:
请问如何在现有的hadoop环境中安装?
Hadoop集群监控系统Ambari安装 -
qingtangpaomian:
失败123 写道您好楼主: 我装好之后为啥老是最后一 ...
Hadoop集群监控系统Ambari安装 -
失败123:
您好楼主: 我装好之后为啥老是最后一步Cluster ...
Hadoop集群监控系统Ambari安装
原创文章转载请注明出处
摘要:动态规划 , 三星
一. 题目翻译
1. 描述:
对于一给定的素数集合 S = {p1, p2, ..., pK},考虑一个正整数集合,该集合中任一元素的质因数全部属于S。这个正整数集合包括,p1、p1*p2、p1*p1、p1*p2*p3...(还有其它)。该集合被称为S集合的“丑数集合”。
注意:我们不认为1 是一个丑数。
你的工作是对于输入的集合S去寻找“丑数集合”中的第N个“丑数”。所有答案可以用longint(32位整数)存储。
补充:丑数集合中每个数从小到大排列,每个丑数都是素数集合中的数的乘积,第N个“丑数”就是在能由素数集合中的数相乘得来的(包括它本身)第n小的数。
2. 格式:
INPUT FORMAT:
第 1 行: 二个被空格分开的整数:K 和 N , 1<= K<=100 , 1<= N<=100,000.
第 2 行: K 个被空格分开的整数:集合S的元素
OUTPUT FORMAT:
单独的一行,输出对于输入的S的第N个丑数。
SAMPLE INPUT:
4 19
2 3 5 7
SAMPLE OUTPUT:
27
二. 题解
1. 题意理解(将问题分析清楚,大致用什么思路):
很有意思的一道模拟题目,使用动态规划来实现。题目的思路是维护一个有K个数的池,池中的每一个数(c)都是由一个已经产生的丑数(a)与S中一个素数(b)的积,我们每次从池中选出一个最小的乘积(c)作为下个丑数。同时更新该乘积中丑数(a)为已产生丑数中的下一个(大于a的下一个丑数d)。
这里给出一个示例,输入是sample中的输入,算法的处理过程请参考下图。等号左边是已产生的丑数集合,右边为上段文字所述的池。
2. 具体实现(具体实现过程中出现的问题):
这道题目的动态规划方程与之前我们看到的动态规划方程有些小不同:
F(n) = min{F(i1)*P(j1) , F(i2)*P(j2) ..... F(ik)*P(jk)},F(n)表示产生的第n个丑数,P(n)表示是素数集合S中的第n个素数。
3. 需要注意的细节 :
这里要特别注意可能出现重复的问题,如果出现重复的则计算下一个。
4. 启示:
这道题目的动态规划方程比较特别,子问题的选择与移动不是简单的++,而是只有当特定的子问题满足备选条件时才继续像下移动。
这种问题的解法注意积累与总结。
三. 代码
/* ID:fightin1 LANG:JAVA TASK:humble */ package session_3_1_3; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashSet; import java.util.Scanner; public class humble { public static void main(String[] args) throws Exception { Scanner in = new Scanner(System.in); PrintWriter pw = new PrintWriter(System.out); // Scanner in = new Scanner(new BufferedReader(new FileReader( // "humble.in"))); // PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter( // "humble.out"))); int k = in.nextInt(); int n = in.nextInt(); long[] prims = new long[k]; //素数集合 int[] index = new int[k]; //池中数字当前取到哪一个丑数 ArrayList<Long> al = new ArrayList<Long>(); //产生的丑数集合 HashSet<Long> hash = new HashSet<Long>(); //为了避免产生同样值得丑数 for (int i=0;i<k;i++){ prims[i] = in.nextInt(); index[i] = 0; } al.add((long)1); while (al.size()<=n){ long min = Long.MAX_VALUE; int minIndex = 0; for (int i=0;i<k;i++){ long temp = prims[i]*al.get(index[i]); if (temp<min){ min = prims[i]*al.get(index[i]); minIndex = i; } else if (temp == min){ //be attention , there may be some equal element index[i]++; } } al.add(min); //从池中选出乘积最小的数,加入池中 index[minIndex]++; } pw.println(al.get(n)); pw.close(); } }
发表评论
-
USACO - 3.2.2 - Stringsobits
2012-08-23 16:02 805原创文章转载请注明 ... -
USACO - 3.2.1 - Factorials
2012-08-23 16:01 697原创文章转载请注明出处 摘要:动态规划 ... -
USACO - 3.1.6 - Stamps
2012-08-23 16:01 1034原创文章转载请注明 ... -
USACO - 3.1.5 - Contact
2012-08-23 16:01 906原创文章转载请注明出处 摘要:二叉树的应用 , ... -
USACO - 3.1.2 - Score Inflation
2012-08-22 10:05 902原创文章转载请注明出处 摘要:动态规划 ... -
USACO - 3.1.1 - Agri-Net
2012-08-22 10:04 852原创文章转载请注明出处 摘要:Prim算法 , ... -
USACO - 2.4.5 - Fractions to Decimals
2012-08-22 10:04 958原创文章转载请注明出处 摘要:模拟 , 数论 ... -
USACO - 2.4.4 - Bessie Come Home
2012-08-22 10:04 901原创文章转载请注明出处 摘要:Dijkstra ... -
USACO - 2.4.2 - Overfencing
2012-08-22 10:03 998原创文章转载请注明 ... -
USACO - 2.4.1 - The Tamworth Two
2012-08-21 10:37 715原创文章转载请注明出处 摘要:模拟 ... -
USACO - 2.3.5 - Controlling Companies
2012-08-21 10:37 1299原创文章转载请注明出处 摘要:BFS , 模拟 ... -
USACO - 2.3.4 - Money Systems
2012-08-21 10:37 865原创文章转载请注明 ... -
USACO - 2.3.3 - Zero Sum
2012-08-21 10:36 741原创文章转载请注明出处 摘要:dfs , 枚举 ... -
USACO - 2.3.2 - Cow Pedigrees
2012-08-21 10:36 1007原创文章转载请注明 ... -
USACO - 2.3.1 - Longest Prefix
2012-08-20 20:31 1039原创文章转载请注明 ... -
USACO - 2.2.4 - Party Lamps
2012-08-20 20:30 1205原创文章转载请注明出处 摘要:枚举,三星 ... -
USACO - 2.2.3 - Runaround Numbers
2012-08-20 20:30 657原创文章转载请注明 ... -
USACO - 2.2.2 - Subset Sums
2012-08-20 20:30 692原创文章转载请注明出处 摘要:动态规划 ,0- ... -
USACO - 2.2.1 - Preface Numbering
2012-08-20 20:29 888原创文章转载请注明出处 摘要:模拟 , 数学分析 ... -
USACO - 2.1.5 - Hamming Codes
2012-08-18 19:22 779原创文章转载请注明出处 摘要:枚举、暴力 ...
相关推荐
USACO题目,Greedy Gift Givers
此c++代码实现了USACO上Bessie Come Home的问题,并运用了弗洛伊德算法
此C++程序是实现了USACO网站上的Magic Squares的问题。
该题来自USACO,为最长串的查找,此处方法很笨,有更好方法
USACO chapter one.May hope it useful to someone
USACO chapter two.Useful for beginners.
usaco 上的题目barn1,beads,calfflac,可到那里查看具体题目
Notes-USACO-2021-弹簧
USACO-Cpp
C-Usaco-Work:Usaco在C中的工作
USACO-实践USACO 培训网站的工作实践代码! 100% 工作 - 大部分优化 - 混合语言
这是USACO2001-2007月赛全集。 usaco是美国中学生的官方竞赛网站。是美国著名在线题库,专门为信息学竞赛选手准备。推荐直接阅读英语原文,既准确可靠又可提高英语水平。做题方式模拟正式比赛,采用标准测评机、文件...
资源包包括USACO 2001-2007年月赛的测试数据;usaco月赛十年题典(2000-2009),usaco月赛2002-2008题解。单独下载需资源分30分以上。为了方便编程爱好者,我这边统一下载打包。欢迎下载。
usaco 2010-2011 nov news,喜欢usaco的朋友可以看看
USACO培训网站 我为章节解决方案。 每个文件的多行USACO标识信息注释 第1章全部的解决方案 第2章全部的解决方案
USACO-TurtleCamera 该存储库包含我对USACO问题的所有解决方案。 CSE 199工作区目录将是我用来帮助开发USACO课程的主要目录。
我的USACO题解和程序
Java中的USACO金问题 YYMM 姓名 文件夹 笔记 代码 1812 美食 1812 牛适应性 1812 团队合作
USACO-Guide
USACO培训页面美国计算机奥林匹克训练页2015年6月17日开始