zju 1596, 哪儿错了?

Wugifer 2003-07-21 01:35:06
Wrong Answer,请高手指点。

#include <string.h>
#include <list>
#include <iostream>
using namespace std;

inline unsigned long long fromstring (char* s)
{
long long result = 0;
for (unsigned i = 0; i < strlen (s); ++i)
{
result *= 10;
result += s [i] - '0';
}
return result;
}

inline void insert (list <unsigned long long>& maybe, unsigned long long v)
{
for (list <unsigned long long> ::iterator it = maybe .begin (); it != maybe .end (); ++it)
{
if ((*it) > v)
{
maybe .insert (it, v);
return;
}
else if ((*it) == v)
{
return;
}
}
maybe .push_back (v);
}

inline unsigned long long calc (unsigned long long a, unsigned long long b, unsigned long long c, unsigned long long n)
{
list <unsigned long long> maybe;
maybe .push_back (1);

for (unsigned long long i = 0; i < n; ++i)
{
unsigned long head = * maybe .begin ();
insert (maybe, head * a);
insert (maybe, head * b);
insert (maybe, head * c);
maybe .pop_front ();
}

return * maybe .begin ();
}

int main (int argc, char* argv [])
{
char sa [100], sb [100], sc [100], sn [100];
while (cin >> sa >> sb >> sc >> sn)
{
unsigned long long a = fromstring (sa);
unsigned long long b = fromstring (sb);
unsigned long long c = fromstring (sc);
unsigned long long n = fromstring (sn);

cout << calc (a, b, c, n) << endl;
}

return 0;
}
...全文
92 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
LeeMaRS 2003-07-22
  • 打赏
  • 举报
回复
hehe 章鱼...^O^
ZhangYv 2003-07-22
  • 打赏
  • 举报
回复
如果是LeeMaRS回答,他会说:
类似于1095.我们知道,如果前m-1个丑数(包含1)已经求出来了,那么第m个数肯定是由前面某个丑数乘素数集合P里的素数得来的。设h[i]为第i个丑数,pindex[i]为和p[i]相乘构成一个新的丑数的最后一个丑数序号。如果h[pindex[i]]乘以p[i]而得到h[m]的话,把每次乘p[i]的pindex[i]列出来,肯定是单调的!利用这个,我们可以得到这样的算法:

1.nhum=0 ,表示求第 nhum 个丑数(默认 h[0]=1)
2.令 pindex[i]=0 ,表示一开始无论怎么乘,都是乘 h[0]
3.if (nhum > n ) then goto 7
4.初始化 min = 无穷大,循环,对所素数集合中所有的素数 p[i]
 (1)先调整 pindex[i],直到 h[pindex[i]]*p[i] 的值比 h[nhum-1] 大为止
 (2)将乘积与已有的最小值 min 比较,求出最小值。
5.把这个最小值 h[pindex[minp]]*p[minp] 存入 h[nhum]
6.nhum:=nhum+1;
7.结束
这个算法复杂度显然为O(nk)
Wugifer 2003-07-22
  • 打赏
  • 举报
回复
感谢各位的参与,问题出在

unsigned long head = * maybe .begin ();

改成

unsigned long long head = * maybe .begin ();

就 Accept 了。
mmmcd 2003-07-21
  • 打赏
  • 举报
回复
LeeMaRS的校友

#include<iostream>
#include<vector>
using namespace std;
int main()
{
int p1,p2,p3,i,n;
long long a,b,c,min;
vector<long long> sp;
for(;cin>>a>>b>>c>>n;)
{
p1=p2=p3=0;
sp.resize(1);
sp[0]=1;
for(i=1;i<=n;i++)
{
min=sp[p1]*a;
if(min>sp[p2]*b)min=sp[p2]*b;
if(min>sp[p3]*c)min=sp[p3]*c;
sp.push_back(min);
while(sp[p1]*a<=min)p1++;
while(sp[p2]*b<=min)p2++;
while(sp[p3]*c<=min)p3++;
}
cout<<sp[n]<<endl;
}
return 0;
}
ZhangYv 2003-07-21
  • 打赏
  • 举报
回复
召唤LeeMaRS...

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧