Cod sursa(job #50963)

Utilizator varuvasiTofan Vasile varuvasi Data 9 aprilie 2007 14:36:11
Problema Semne Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <stdio.h>
#include <stdlib.h>
#include <fstream.h>
#include <string.h>
#include <iostream.h>
long long S, sum;
int N;
char semn[50100];
int A[50100];
char buffer[1000001];

//using namespace std;
int main()
{
//    freopen("semne.in", "rt", stdin);
    ifstream fin("semne.in");
    freopen("semne.out", "wt", stdout);
//    FILE *fin = fopen("semne.in", "rt");
//    FILE *fout = fopen("semne.out", "wt");
    int i = 0, v;
    double r;
    srand( time(0) );
    fin >> N >> S;//    scanf("%d %lld", &N, &S);
    fin.get();
    fin.read(buffer, 1000001);
    
    v = rand() % 2;
    
    int len = strlen(buffer), nr = 0, cnt = 0;
    for (i = 0; i < len; i++)
        if (buffer[i] == ' ')
		{
            A[++cnt] = nr;
            if (v)
            {
                sum += A[cnt];
                semn[cnt-1] = '+';
            }
            else 
            {
                sum -= A[cnt];
                semn[cnt-1] = '-';
            }        
            nr = 0;
        }
		else
			if (buffer[i] != '\n')
				nr = nr * 10 + (buffer[i] - '0');
        
    A[++cnt] = nr;
    sum += A[cnt];
    semn[cnt-1] = '+';
    
    /*for (i = 1; i <= N; i++)
    {
    //    scanf("%d", &A[i]);
        //if (v == 0) sum += A[i];
        //else sum -= A[i], semn[i] = 1;
        sum += A[i];
        semn[i-1] = '+';
        //r = (   (double)rand() / ((double)(RAND_MAX)+(double)(1)) );
        //printf("%d", (int)(r * (double)N) + 1);
    }*/
    fin.close();
//    fclose(fin);
    while (S != sum)
    {
        if (S < sum) 
        { 
            r = (   (double)rand() / ((double)(RAND_MAX)+(double)(1)) );
            v = (int)(r * (double)N) + 1;
            while (semn[v-1] == '-')
            {
                r = (   (double)rand() / ((double)(RAND_MAX)+(double)(1)) );
                v = (int)(r * (double)N) + 1;
            }    
            semn[v-1] = '-';
            sum -= 2*A[v];
        }
        if (S > sum)
        {
            r = (   (double)rand() / ((double)(RAND_MAX)+(double)(1)) );
            v = (int)(r * (double)N) + 1;
            while (semn[v-1] == '+')
            {
                r = (   (double)rand() / ((double)(RAND_MAX)+(double)(1)) );
                v = (int)(r * (double)N) + 1;
            }    
            semn[v-1] = '+';
            sum += 2*A[v];
        }
    }
    
    printf("%s", semn);
//   fclose(fout);
    
    return 0;
}