poj 2545 Hamming Problem

参考别人的思路写的,别人的这种算法很给力!

效率很高O(n)的效率

#include <iostream>
#include <stdio.h>

using namespace std;

__int64 ans[1000000];

__int64 getMin(__int64 a,__int64 b,__int64 c)
{
    __int64 rs=0;
    rs=a<b?a:b;
	rs=rs<c?rs:c;
	return rs;
}

int main()
{
	__int64 a,b,c,M;
	scanf("%I64d%I64d%I64d%I64d",&a,&b,&c,&M);

    __int64 a2,a3,a5,i,tmp,n;
    a2=a3=a5=0;
    ans[0]=1;
    for(i=1;i<=M;i++)
    {
        tmp=getMin(ans[a2]*a,ans[a3]*b,ans[a5]*c);
        ans[i]=tmp;
        if(tmp==ans[a2]*a)
            ++a2;
        if(tmp==ans[a3]*b)
            ++a3;
        if(tmp==ans[a5]*c)
            ++a5;
    }

	printf("%I64d\n",ans[M]);
    return 0;
}
时间: 2025-01-01 03:04:24

poj 2545 Hamming Problem的相关文章

算法题:poj 3080 Blue Jeans(KMP匹配,枚举子串)

链接: http://poj.org/problem?id=3080 题目大意: 给出m(2<=m<=10)个DNA序列, 求出这m个序列中最长的公共字串.如果有多个相同长度的, 输出字典序最小的. 分析与总结: 依次枚举所有的子串, 然后再看是否在所有序列中都能够匹配.保存下长度最大且字典序最小的序 列. 代码: #include<iostream> #include<cstdio> #include<cstring> using namespace st

HDOJ(HDU) 1898 Sempr == The Best Problem Solver?(水题、、、)

Problem Description As is known to all, Sempr(Liangjing Wang) had solved more than 1400 problems on POJ, but nobody know the days and nights he had spent on solving problems. Xiangsanzi(Chen Zhou) was a perfect problem solver too. Now this is a story

UVa 729 The Hamming Distance Problem:全排列输出及小细节

729 - The Hamming Distance Problem Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=670 The Hamming distance between two strings of bits (binary integers) is the number of

poj 1207 The 3n + 1 problem

当我看到题目的时候我就感觉到这是一道彻彻底底的水题,因为很像A+B的作风... 但是看完题目我心里想了想:应该没有那么水吧,可能还是要优化的,暴力可能会TLE... 但是我暴力过了以后我这样想:....... 下面摘抄了一点文字说明: 大致题意: 根据给定的算法,可以计算一个整数的循环数 现在给定一个区间,计算这个区间的所有数的循环数,把最大的循环数输出 PS:输出的是整数A的循环数,而不是输出整数A 解题思路: 注意的只有一点: 输入的两个区间端点不一定是从小到大输入的,因此要先对这两个数排一

poj 3468 A Simple Problem with Integers

点击打开链接poj 3468 思路:线段树成段更新 分析: 1 最基础的线段树的成段更新的题目,我们只要建好线段树然后进行更新即可 2 注意由于输入的数最大为10^9,因此我们应该使用long long,区间的和已经区间的延时标记都要为long long 代码: #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; type

HDOJ 1032(POJ 1207) The 3n + 1 problem

Description Problems in Computer Science are often classified as belonging to a certain class of problems (e.g., NP, Unsolvable, Recursive). In this problem you will be analyzing a property of an algorithm whose classification is not known for all po

poj 2535 Very Simple Problem

开始题意搞错了,一直以为是最简单的问题才行... 后来看discuss才发现只要简单就可以了,里面看到一个很不错的题意解释... 问题: n个人给p道题打分,一道题是最容易题的条件: 该题被评为最简单的次数要过半,而且该题没有被任何评委评为最难. 方法: 可设置3个数组,数组A用来读入数据,数组B纪录对应的题目是否被 打成"最难"的了, 数组C纪录该道题被评委打成"最简单"的次数.当然 这个"最难"和"最简单"只是针对这个评委

poj 1350 Cabric Number Problem

这道题目肯定是不难的,但是的的确确有很多小问题很懊恼,其实在比赛中就最怕这种题,因为那个时候大家的心情都是非常紧张的,这种题就是总是WA,就是不知道为什么...... 题意比较简单:就是输入一个数(各个数位不全相同,且数字的长度为4),将它的各位从大到小排得的数maxnum和各位从小到大排的数minnum相减,反复循环直至值为0或者6147.且如果开头有0那么0不参与排序. 陷阱有2个:1.如果输入的数小于4位或者大于4位都输出No!!如果忽略了这一点就会OLE. 2.最恶心的,就是题目里面没说

poj 1298 The Hardest Problem Ever

题目是很水的,要注意两点,一个就是字符串必须比放入的数组多一个,如这道题strlen(a)=26,sizeof(a)=27... 还有一点就是gets()函数可以输入空格,不能输入回车,但是s%不能输入空格,也不能输入回车 AC的代码: #include <stdio.h> #include <string.h> char a[27] = {'V','W','X','Y','Z', 'A','B','C','D','E','F','G', 'H','I','J','K','L','