Cod sursa(job #785233)

Utilizator NicuCJNicu B. NicuCJ Data 8 septembrie 2012 10:41:55
Problema Semne Scor 100
Compilator cpp Status done
Runda as1 Marime 1.26 kb
#include <fstream>
#include <cstdlib>
#include <ctime>
using namespace std;

int x[50001], sol[50001], n, i, nrPlus, plusuri[50001], nrMinus, minusuri[50001], plusRand, minusRand;
long long sum, nrSol;
bool solGasita;

int main()
{
	srand(time(NULL));
	ifstream f("semne.in");
	ofstream g("semne.out");
	f>>n>>sum;
	for(i=1; i<=n; i++)
	{
		f>>x[i];
		sol[i]=rand()%2;
		if(sol[i])
		{
			nrSol+=x[i];
			nrPlus++;
			plusuri[nrPlus]=i;
		}
		else
		{
			nrSol-=x[i];
			nrMinus++;
			minusuri[nrMinus]=i;
		}
	}
	while(nrSol!=sum)
	{
		if(nrSol<sum)
		{
			//scadem un minus random de la solutie
			minusRand=rand()%nrMinus+1;
			nrPlus++;
			plusuri[nrPlus]=minusuri[minusRand];
			//adunam de 2 ori pentru ca odata dispare minusul, odata apare plusul
			nrSol+=2*x[plusuri[nrPlus]];
			sol[plusuri[nrPlus]]=1;
			//punem minusul de la sfarsit pe pozitia de pe care l-am scos
			minusuri[minusRand]=minusuri[nrMinus];
			nrMinus--;
		}
		else
		{
			plusRand=rand()%nrPlus+1;
			nrMinus++;
			minusuri[nrMinus]=plusuri[plusRand];
			nrSol-=2*x[minusuri[nrMinus]];
			sol[minusuri[nrMinus]]=0;
			plusuri[plusRand]=plusuri[nrPlus];
			nrPlus--;
		}
	}
	for(i=1; i<=n; i++)
	{
		if(sol[i])
			g<<'+';
		else
			g<<'-';
	}
}