Cod sursa(job #1712451)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 2 iunie 2016 21:30:26
Problema Semne Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <stdio.h>
#include <stdlib.h>

long long p[5000001], m[5000001];
int main(){
    long long n, s;
    FILE*fi,*fo;
    fi=fopen("semne.in","r");
    fo=fopen("semne.out","w");
    fscanf(fi,"%lld%lld", &n, &s);
    int i;
    long long sum=0;
    for(i=1;i<=n/2;i++){
        long long x;
        fscanf(fi,"%lld", &x);
        sum+=x;
        p[x]++;
    }
    while(i<=n){
        long long x;
        fscanf(fi,"%lld", &x);
        sum-=x;
        m[x]++;
        i++;
    }
    while(sum!=s){
        if(sum>s){
            long long tosrc=(sum-s)/2;
            long long i, j;
            i=j=tosrc;
            while(p[i]==0 && p[j]==0){
                if(i>0) i--;
                if(j<5000000) j++;
            }
            if(p[i]>0){
                p[i]--;
                m[i]++;
                sum=sum-2*i;
            }
            else{
                p[j]--;
                m[j]++;
                sum=sum-2*j;
            }
        }
        else{
            long long tosrc=(sum-s)/2;
            long long i, j;
            i=j=tosrc;
            while(m[i]==0 && m[j]==0){
                if(i>0) i--;
                if(j<5000000) j++;
            }
            if(m[i]>0){
                m[i]--;
                p[i]++;
                sum=sum+2*i;
            }
            else{
                m[j]--;
                p[j]++;
                sum=sum+2*j;
            }
        }
    }
    for(int i=1;i<=5000000;i++){
        if(p[i]>0)
            fprintf(fo,"+");
        if(m[i]>0)
            fprintf(fo,"-");
    }
    fclose(fi);
    fclose(fo);
    return 0;
}