转一篇好文:poj1338 poj2591 poj2545 这三道题

poj1338 poj2591 poj2545 这三道题

先来看1338

题目定义一种集合,使得其中的元素的素数因子只能是2,3,5

即:1, 2, 3, 4, 5, 6, 8, 9, 10, 12, ...

要求这个集合的第n个数是多少

很直接的想法,我们通过题目的要求预处理算出这样的集合,然后再输出第n个数

当然,我们在得到这样的一个数组num[]时,必须是从小到大的,其实这也是关键所在

这个集合是通过集合里的每一个数 × 2,× 3,× 5来扩展的,要想从小到大,从num[1]开始扩展时,由于× 2,× 3,× 5大小不同,所以num[]的下一个元素是这三个数的最小值。所以到下次时,2是在乘以新的元素,而3,5还在乘原来的元素,但这三个数比较后最小的继续添加进集合里。由于有了这样的延迟作用,我们可以设置三个指针p2,p3,p5分别指向2,3,5待乘的数。

要记得处理重复的数,在每扩展一个元素时,判断该数是否能通过其他数来乘得,是的话就右移p

参考自:http://acm.pku.edu.cn/JudgeOnline/showmessage?message_id=113667

代码:

#include<iostream>
using namespace std;
int main(){
 long long ans[1510] = {0,1};
 int p2 = 1,p3 = 1,p5 = 1;
 for(int i =2;i<=1500;i++){
  ans[i] = min(ans[p2]*2,min(ans[p3]*3,ans[p5]*5));
  //他们乘时有延迟,不同数有先乘后乘,但各自的p指向他们下次要乘的数
  if(ans[i]==2*ans[p2])p2++;
  if(ans[i]==3*ans[p3])p3++;
  if(ans[i]==5*ans[p5])p5++;
 }
 int n;
 while(cin>>n,n)cout<<ans[n]<<endl;
 return 0;
}
现在来看poj2591,只是定义集合的方式不同了而已:
Set S is defined as follows:
(1) 1 is in S;
(2) If x is in S, then 2x + 1 and 3x + 1 are also in S;
(3) No other element belongs to S.
代码

#include<iostream>
using namespace std;
int ans[10000010] = {0,1};
int main(){
 int p2 = 1,p3 = 1;
 for(int i =2;i<=10000000;i++){
  ans[i] = min(ans[p2]*2+1,ans[p3]*3+1);
  if(ans[i]==2*ans[p2]+1)p2++;
  if(ans[i]==3*ans[p3]+1)p3++;
 }
 int n;
 while(cin>>n)cout<<ans[n]<<endl;
 return 0;
}
poj2545
#include<iostream>
using namespace std;
long long num[1000000],a,b,c,pa,pb,pc,n;
int main()
{
    cin>>a>>b>>c>>n;
    num[0] = 1;
    pa=pb=pc =0;
    for (int i =1;i<=n;i++)
    {
        num[i] = min(num[pa]*a,min(num[pb]*b,num[pc]*c));
        if (num[i]==num[pa]*a)pa++;
        if (num[i]==num[pb]*b)pb++;
        if (num[i]==num[pc]*c)pc++;
    }
    cout<<num[n]<<endl;
return 0;
}
只要记住那加亮的核心代码就行了,就可以用来按照已给表达式来扩展集合,
主要是设置指针来使元素从小到大,且不重复!
附:poj1338用优先级队列和set实现的版本:
#include<iostream>
#include<queue>
using namespace std;

typedef pair<long long,int> node;//要用long long
int main(){
 vector<long long>ans;
 priority_queue<node,vector<node>,greater<node> > que;//最小堆
 que.push(make_pair(1,2));
 for(int i =1;i<=1500;i++){
    node top = que.top();//每次选最小的作为下一次的被乘数
    que.pop();
  //注意这里每个case后面没有break,这样处理可以避免重复的插入
  switch(top.second){//乘的时候是乘上一次乘时的质数开始,这样从小到大乘就不会重复了,不然大的又回去乘2
   case 2:que.push(make_pair(top.first*2,2));
   case 3:que.push(make_pair(top.first*3,3));
   case 5:que.push(make_pair(top.first*5,5));
    }
    ans.push_back(top.first);//将最小的数加入容器,以后这个容器才是从小到大的
 }
 int n;
 while(cin>>n,n)cout<<ans[n-1]<<endl;
 return 0;
}
#include<iostream>
#include<set>
using namespace std;
int main(){
 long long ans[1510];
 set<long long>se;
 se.insert(1);
 for(int i =1;i<=1500;i++){//set会自动处理重复的数!
    ans[i] = *se.begin();
    se.erase(se.begin());
    se.insert(ans[i]*2);
    se.insert(ans[i]*3);
    se.insert(ans[i]*5);
 }
 int n;
 while(cin>>n,n)cout<<ans[n]<<endl;
 return 0;
}
时间: 2024-08-20 02:32:13

转一篇好文:poj1338 poj2591 poj2545 这三道题的相关文章

站长再创作一篇软文时必知的三个流程

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 顾名思义,软文是相对于硬性广告而言,由企业的市场策划人员或广告公司的文案人员来负责撰写的"文字广告".与硬广告相比,软文之所以叫做软文,精妙之处就在于一个"软"字,好似绵里藏针,收而不露,克敌于无形,等到你发现这是一篇软文的时候,你已经冷不丁地掉入了被精心设计过的"软文广告"陷阱.它

如何让一篇软文增加最多的外链

通过写软文来提高网站权重和排名是目前青岛seo最常用的一种seo手段,相信很多站长或Seoer也都感受到了软文的力量和强大吧.曾经青岛seo专门写过一篇文章"软文在seo中的重要作用",大家可以先了解一下. 我们站长写软文,不同于那种构思巧妙的商家广告软文,不是为做某个产品而直接写软文,主要目的是给网站增加高质量的外链,通过强大的外链提升网站的权重和排名.关于软文怎么写这里暂不做深入探讨,软文主要考验的是站长写作能力的基本功,其实站长写软文相对还是很容易的,写点建站经验,写点seo技巧

解读如何正视一篇软文所带来的可见价值

软文推广一直是所有推广方式最热门的方式之一,与硬性推广相比,软文推广的精妙之处就是在于一个"软"字.好似绵里藏针,收而不露,克敌于无形.软文推广追求的是一种春风化雨.润物无声的传播效果.那么对于我们推广人员来说如何正视一篇软文所带来的可见价值?下面笔者就以在站长网投递软文为例分析其中的可见价值. 一.最直观的价值:获得高质量的外链 这个肯定是大家首先能够想到的,在站长网投稿软文可以带来很多转载量,而我们的文章附带的外链也可以得到传播.而如何直观的查看软文所带来的外链呢?下面笔者就简单的

如何数字化来评估一篇软文的效果

我们只知道软文是有效果的,这个效果的概念是相当模糊的.很多人一直在说要数字化来评估seo的效果,软文又何尝不需要数字化来评估其效果呢?那么我们可以从哪些方面来评估呢? 1,转载率 软文只有被转载后,它的效果可以说才是最大化的.但有个前提那就是转载我们软文的人,保留了我们的版权链接.但有些站长的劣根性,注定了他喜欢窃取别人的劳动成果的.所以,这个转载率,不是指文章被多少个站点转载了.而是被多少个站点转载后,留了版权链接的个数.比如,文章被转载了100次,留了链接的有25个,那么我们的转载率就是25

一篇软文在站长网A5发布的重要性

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 对了站长来说,大家都知道网站内容是多么的重要,特别是写一篇好的文章不仅是可以吸引很多浏览的人,而且一篇好的文章也会被别人拿去转载.这样一来提高自己的流量,也促使别人为我们做宣传.这点我想很多人到知道,但我今天也不是主要为了写关于软文的重要性.因为这个大家都知道.我是想告诉大家一篇软文在a5发布的重要性远远比其他地方权重来得重要,不是一般的重要

iOS Foundation 框架 224 篇相关文档分类整理

iOS Foundation 框架 224 篇相关文档分类整理 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 截至 2014-05-02 ,苹果官网 Foundation 框架相关文档共计 2

Java栈与堆一篇好文

Java栈与堆   ----对这两个概念的不明好久,终于找到一篇好文,拿来共享   1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆.   2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器.但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性.另外,栈数据可以共享,详见第3点.堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再

第一篇——第一文 SQL Server 备份基础

原文:第一篇--第一文 SQL Server 备份基础 当看这篇文章之前,请先给你的所有重要的库做一次完整数据库备份.下面正式开始备份还原的旅程. 原文出处: http://blog.csdn.net/dba_huangzj/article/details/22683687 前言 为什么要备份?理由很简单--为了还原/恢复.当然,如果不备份,还可以通过磁盘恢复来找回丢失的文件,不过SQL Server很生气,后果很严重.到时候你就知道为什么先叫你备份一次再开始看文章了.∩__∩.本系列将介绍SQ

浅谈如何看待一篇软文带来的作用

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 软文以其的高效和低廉一直受到SEOER的追捧,那么该如何看待一篇或者几篇软文带来的效果呢?我这里分析的软文主要是分析在站长门户投稿的那些. 一.最直观的,查看外链 这个肯定大家都知道,但是我可以肯定的是你们知道的查法肯定是得不出结果的,下面说说比较常用的方法和我认为比较好的方法. 1.domain+你的域名,如果你是一个新站,那还好说可能本来