您的位置:首页 > 其它

算法设计几个经典思维题目

2013-10-24 19:46 281 查看
算法课和.net是最有意思的两门课,一定得好好听!

1.求n!尾数0的个数?(n>=10000)

开始,我想的是dp的方法,但也说不上怎么dp。仔细想一下0是如何产生的呢?

是2*5产生的,我们需要统计2和5的个数,不用想也清楚,2的个数肯定大于5的

个数2,4=2*2,6=2*3,8=2*2*2.因此我们只需要统计5的个数即可。而如何统计

5的个数也成为一个众说纷纭的问题。其实可以达到O(1)的复杂度,

n!中包含5的个数为 n/5+n/25+n/125+n/625+........

我们可以这样想,开始用/5统计的是只有一个5因子的,但是/25统计的是有两个5

因子的,由于前面算了一次,现在只需要再加一次即可。依次类推。

2.1~10个箱子,每个箱子里放1000个球,每个箱子要么全次品,要么全正品,每个

正品球质量为100g,每个次品质量为100g.问用天平测一次质量,告诉我哪几个箱

子里是次品?

记得以前雄鹰给我看的那个题目是这个题目的缩减版,十个箱子,每个箱子十个球,

每个箱子要么全次品,要么全正品,正品质量1kg,次品质量0.9kg.有一个箱子里是

次品,其他箱子里都是正品。问用天平测一次质量,告诉我哪个箱子是次品?

这个题目的解法是第一个箱子取1个,第二个箱子取2个。。。。第十个箱子取

10个。这样根据小数点后面的数字判断哪个箱子是次品,应该很好懂吧。

还是回到这个题目,开始自己的想法是第一个取1个,第二个取2个,第三个取3个,

第四个取4个。但是这样却不合理,因为质量可能出现交叉的情况,9*100=10*90.

所以这样取球难免有纰漏。我们可以这样取球,第一箱取1个,第二箱取2个,第三

箱取4个。。。第十箱取512个,这样很保险,最后可以表示成唯一的1111111111,

相当于每位有了权重,为0则*90,为1则*100。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int a[12];
int b[12];

int main()
{
int wei;
cout<<"**************************"<<endl;
cout<<endl;
cout<<"**按1:请输入产品的重量****"<<endl;
cout<<endl;
cout<<"**按2:请输入与全部正的差量****"<<endl;
cout<<endl;
cout<<"**按0:退出系统****"<<endl;
cout<<endl;
cout<<"**************************"<<endl;

int ch;
while(cin>>ch&&ch)
{
cin>>wei;
if(ch==1)
wei=(10230-wei)/10;
else wei/=10;

memset(a,0,sizeof(a));
int i=1;
while(wei)
{
a[i++]=wei&1;
wei>>=1;
}

int t=0;
for(i=1;i<=10;i++)
{
if(a[i])
b[t++]=i;
}
if(t==0) cout<<"全部为正品"<<endl;
else
{
cout<<"次品为:"<<endl;
for(i=0;i<t;i++)
cout<<b[i]<<" ";
cout<<endl;
}
}
return 0;
}


3.一个人需要到200m的地方去送信,但是他每次行走只能负重120m的粮食。

每走1m需要消耗走1m的粮食。

问这个人最少需要多少粮食才能够到达送信的地方?

这样就牵扯到一个问题。怎么走才能最省粮食,如果能想到这里,我们就可以先画

一条线段,AB,A是起点,B是需要到达的地方,AB的长度为200m,我们不妨假设

走1m需要1kg的粮食,如果我们需要消耗最少的粮食,倒着推!我们需要在离A 80m

的C点存储120kg的粮食即可,等走到C点,就可以一次到达了。每次往B方向走,人

都需要负重120kg,这样才能达到最省粮食如果要给C运120kg的粮食,不可能一次就

把120kg的粮食直接运到C处。最少需要两次。我们设还有一个点D,CD=x, D处囤粮

240kg,那么有2*120-3*x=120,每次往B方向走都带着120,每次往A走,只需要带够

路上吃的就可以了。算出x=40,依次可以找出E点,E处需囤粮360,

设DE=y,360-5*y=240,得到DE=24,现在AE=16,480-7*z=360,z<24,所以可以直接

往E处运粮即可一次负重120运到E处88kg,运三次就有264kg的粮食,最后一次出发只

需要带上112kg粮食,然后到E处264+112-16刚好等于360.

这样最少需要带的粮食为120*3+112.正解为472kg.

今天看了一下暑假做的一些真题,很多方法记得,但是需要用的时候却想不到,动态

规划从坐上往右下,双向看最长能延伸的位置,还有分治的思想,先归并再枚举,考虑

时间因素。还有就是自己学习的扩展KMP题目,很久没看了,也很模糊。赶紧捡起来,

认真地学习啊,经常温故才行,而且得学习算法的真谛。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: