Pagini recente » Cod sursa (job #823667) | Cod sursa (job #3192867) | Cod sursa (job #1355351) | Cod sursa (job #341326) | Cod sursa (job #791161)
Cod sursa(job #791161)
Utilizator |
Nicu B. NicuCJ |
Data |
23 septembrie 2012 11:35:37 |
Problema |
Cifra |
Scor |
0 |
Compilator |
cpp |
Status |
done |
Runda |
asem-info |
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<<'-';
}
}