閱讀31 返回首頁    go 阿裏雲 go 技術社區[雲棲]


【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

  上一篇:go 星星評分定製
  下一篇:go MOM係列文章之 - MQ可運維性