Cod sursa(job #465893)

Utilizator SheepBOYFelix Liviu SheepBOY Data 25 iunie 2010 13:52:27
Problema Minim2 Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 1 Marime 1.59 kb
#include<stdio.h>
#include<stdlib.h>
struct KeepTight{
float drum;
bool apply;
};
int n;
KeepTight DrumP[100001];
double pwr,scout,limmit;

void OpenGate()
{
    freopen("minim2.in","r",stdin);
    freopen("minim2.out","w",stdout);
}
void GetData()
{
    scanf("%d",&n);

    for(int i=0;i<n;++i)
        scanf("%d",&DrumP[i].drum);

    scanf("%f%f%f",&pwr,&scout,&limmit);
}
inline int cmp(const void *a,const void *b)
{
    KeepTight x,y;
    x=*(KeepTight *)a;
    y=*(KeepTight*)b;

    if(x.drum<y.drum)
        return 1;
    if(x.drum>y.drum)
        return -1;
    if(x.drum==y.drum)
        return 0;
}
inline double abs(double a, double b)
{
    a=a-b;
    return (a<0)?-a:a;
}
inline void Recalc(double &sum)
{
    sum=0;
    for(int i=0;i<n;++i)
        sum+=DrumP[i].drum;
}
void GoProcess()
{
    int i=0,OP=0;
    double tsum=0;
    while( tsum>limmit || abs(limmit-tsum)==0.000001  &&  i<n )
    {
        if(!DrumP[i].apply)
        {
            DrumP[i].drum*=pwr;
            Recalc(tsum);
            ++OP;
            continue;
        }
        if(DrumP[i].drum>DrumP[i+1].drum)
            if(DrumP[i].drum-DrumP[i+1].drum>DrumP[i+1].drum)
               {
                    ++OP;
                    DrumP[i].drum*=scout;
                    Recalc(tsum);
               }
            else
                ++i;
        else
            qsort(DrumP,n,sizeof(DurmP[0]),cmp);
    }

    printf("%d",OP);
}
int main()
{
    OpenGate();
    GetData();
    qsort(DrumP,n,sizeof(DurmP[0]),cmp);
    GoProcess();
    return 0;
}