今天很忙,感觉有点力不从心。
花旗杯显得有些不太把握,总感觉在两周之内很难完成,技术难点太多。
如何实现任务的周期时执行;
如何设计页面;
关键算法又如何实现;
这些都是值得考虑的。
最近在看《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) 编辑 收藏 引用 所属分类:
算法初步