【eps=1e-9】poj 2163 Easy Trading
這題過得想嗬嗬了。。。double型的數很麻煩。。。有一個始終過不了,一直WA,但是學會了另一種double型比較大小的方式。。。
令double eps=1e-9; 然後如果double型的 a和b 比較大小,隻需比較他們的差值和eps的大小即可。。。因為double有誤差
eg: a-b>eps
AC的代碼:
#include <stdio.h>
double price[10005];//每天價格
double cal(int day,int n)
{
//計算第day天,前n天的均價
int i;
double sum=0;
int count=n;
for(i=day;count>0;i--)
{
sum+=price[i];
count--;
}
return (double)sum/(double)n;
}
void work(int m,int n,int k)
{
if(cal(n,m)>cal(n,n))
printf("BUY ON DAY %d\n",n);
else if(cal(n,m)<cal(n,n))
printf("SELL ON DAY %d\n",n);
int i;
for(i=n+1;i<=k;i++)
{
if(cal(i-1,m)<cal(i-1,n) && cal(i,m)>cal(i,n))
printf("BUY ON DAY %d\n",i);
else if(cal(i-1,m)>cal(i-1,n) && cal(i,m)<cal(i,n))
printf("SELL ON DAY %d\n",i);
}
}
int main()
{
int m,n; //幾日均線,且知 m<n
int k; //連續多少天
scanf("%d%d%d",&m,&n,&k);
int i;
for(i=1;i<=k;i++)
scanf("%lf",&price[i]);
work(m,n,k);
return 0;
}
一直WA的代碼:
#include <stdio.h>
double price[10005];//每天價格
bool isOnHand; //手中有股票沒有,沒有是false
double eps=1e-9;
double cal(int day,int n)
{
//計算第day天,前n天的均價
int i;
double sum=0;
int count=n;
for(i=day;count>0;i--)
{
sum+=price[i];
count--;
}
return (double)sum/(double)n;
}
void work(int m,int n,int k)
{
int i;
for(i=n;i<=k;i++)
{
if(isOnHand==false && cal(i,m)-cal(i,n)>eps)
{
printf("BUY ON DAY %d\n",i);
isOnHand=true;
}
else if(isOnHand==true && cal(i,m)-cal(i,n)<eps)
{
printf("SELL ON DAY %d\n",i);
isOnHand=false;
}
}
}
int main()
{
int m,n; //幾日均線,且知 m<n
int k; //連續多少天
scanf("%d%d%d",&m,&n,&k);
int i;
for(i=1;i<=k;i++)
scanf("%lf",&price[i]);
isOnHand=false;
work(m,n,k);
return 0;
}
最後更新:2017-04-03 05:39:53