Cod sursa(job #465914)

Utilizator SmarandaMaria Pandele Smaranda Data 25 iunie 2010 13:58:42
Problema Minim2 Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 1 Marime 1.73 kb
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define eps 0.0000000000000001
double t[10001];
long f[10001];
int main()
{
	long n,i,num=0,poz,da;
	double a,b,r,s,ab,max=-1.0;
	double min,minn;
	
	freopen("minim2.in","r",stdin);
	freopen("minim2.out","w",stdout);
	
	scanf("%ld",&n);
	s=0.0;
	for (i=1;i<=n;i++)
		{
			scanf("%lf",&t[i]);
			s=s+t[i];
			if (t[i]-max>=eps)
				{
					max=t[i];
					poz=i;
				}
		}
	scanf("%lf%lf%lf",&a,&b,&r);
	ab=fabs(s-r);
	if (ab<eps)
		{
			printf("0\n");
			return 0;
		}
	if (s-r<=-eps)
	{
		printf("0\n");
		return 0;
	}
	s=s-t[poz];
	t[poz]=t[poz]*a;
	f[poz]=1;
	s=s+t[poz];
	num++;
	ab=fabs(s-r);
	if (ab<eps)
		{
			printf("%ld\n",num);
			return 0;
		}
	if (s-r<=-eps)
	{
		printf("%ld\n",num);
		return 0;
	}
	while (1)
	{
		num++;
		min=s-t[1]+(t[1]*b);
		poz=1;
		da=1;
		for (i=2;i<=n;i++)
		{
		if (f[i])
		{
			minn=s-t[i]+(t[i]*b);
			ab=fabs(minn-r);
			if (ab<eps)
			{
				printf("%ld\n",num);
				return 0;
			}
			if (minn-r<=-eps)
			{
			   printf("%ld\n",num);
			   return 0;
			}
			if (minn-min<=-eps)
			{
			min=minn;
			poz=i;
			da=1;
			}
		}
		else
		{
		minn=s-t[i]+(t[i]*a);
			ab=fabs(minn-r);
			if (ab<eps)
			{
				printf("%ld\n",num);
				return 0;
			}
			if (minn-r<=-eps)
			{
			   printf("%ld\n",num);
			   return 0;
			}
			if (minn-min<=-eps)
			{
			min=minn;
			poz=i;
			da=0;
			}
		}
		}
		s=s-t[poz];
		if (da==1)
		t[poz]=t[poz]*b;
		else
		{t[poz]=t[poz]*a;f[poz]=1;}
		s=s+t[poz];
		ab=fabs(s-r);
		if (ab<eps)
			{
				printf("%ld\n",num);
				return 0;
			}
		if (s-r<=-eps)
			{
				printf("%ld\n",num);
				return 0;
			}
	}
	return 0;
}