Cod sursa(job #83094)

Utilizator DastasIonescu Vlad Dastas Data 9 septembrie 2007 23:01:11
Problema Semne Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <algorithm>

#define maxn 50001
#define fout out

FILE *in = fopen("semne.in","r"), *out = fopen("semne.out","w");

int a[maxn];
char semn[maxn];

int plus[maxn], k;
int minus[maxn], p;

int n;
long long s;
long long sol = 0;

void read()
{
    fscanf(in, "%d %lld", &n, &s);

    for ( int i = 1; i <= n; ++i )
    {
        fscanf(in, "%d", &a[i]);

        if ( sol <= s )
        {
            plus[++k] = i;
            sol += a[i];
            semn[i] = 1;
        }
        else
        {
            minus[++p] = i;
            sol -= a[i];
            semn[i] = 0;
        }
    }
}

int main()
{
    srand(time(0));
    read();

    int q = 0;
    while ( sol != s )
    {
        if ( sol > s )
        {
            q = rand() % (k+1);
            sol -= (a[ plus[q] ] << 1);
            semn[ plus[q] ] = 0;
            minus[++p] = plus[q];
            plus[q] = plus[k--];
        }
        else
        {
            q = rand() % (p+1);
            sol += (a[ minus[q] ] << 1);
            semn[ minus[q] ] = 1;
            plus[++k] = minus[q];
            minus[q] = minus[p--];
        }
    }

    for ( int i = 1; i <= n; ++i )
        if ( semn[i] == 0 )
            fprintf(fout, "-");
        else
            fprintf(fout, "+");

	return 0;
}