随笔-11  评论-1  文章-0  trackbacks-0
今天很忙,感觉有点力不从心。
花旗杯显得有些不太把握,总感觉在两周之内很难完成,技术难点太多。
如何实现任务的周期时执行;
如何设计页面;
关键算法又如何实现;
这些都是值得考虑的。
最近在看《C++ Primer 第四版》,看完第一章才发现以前的那点C++知识就只能证明自己知道C++的存在。
今天在自己机子上实验成功了SVN在不同局域网的使用,算是一点小成绩。
开始在交大的网站上做新手题了,昨天做的第一题,找零钱问题,结果又是在bbs上发帖,又是在网上搜资料,最后还是靠同学的代码才被accept。
不多说了,上代码,分析一下。
#include<iostream.h>

int main()
{
    
float a[8]={100,50,20,10,5,1,0.5,0.1};
    
float sum;
    
while(cin>>sum)
    {    
        
int count=0,i;
        sum
=sum+0.001;
        
for(i=0;i<8;i++)
        {
            
while(sum>=a[i])
            {
                sum
-=a[i];
                count
++;
            }
        }
        cout
<<count<<endl;
    }
    
return 0;
}
这个题用贪心算法,不难求解。我的疑惑主要有两点:
首先,我在网上搜到一种利用除法和模来计算找零张数的,结果提交上去是wrong answer ,很无语,本来我还感觉比减法要快。
然后就是浮点数比较时经常会出错,所以代码中有个+0.001的小技巧,值得借鉴。
/////////////////////////////////////////////////////
2010年8月7日
根据bbs上题目原作者的提醒,意识到上面提到的解法出现wrong answer的原因在于浮点数的计算误差。修改后代码如下:
 1 #include<iostream> 
 2 using namespace std; 
 3 
 4 int a[8]={1000,500,200,100,50,10,5,1}; 
 5 
 6 int main() 
 7 
 8 double sum; 
 9 int i,count,temp; 
10 while(cin>>sum) 
11 {    
12 sum*=10
13 temp=(int)(sum+0.1); 
14 count=0
15 for(i=0;i<8;i++
16 
17 count+=temp/a[i]; 
18 temp%=a[i]; 
19 
20 cout<<count<<endl; 
21 
22 
23 return 0
24 
第13行中double型的变量sum转为int型的temp之前,要加上0.1,这样就可以被accpet。

posted on 2010-08-05 23:01 douhui 阅读(266) 评论(0)  编辑 收藏 引用 所属分类: 算法初步

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理