Pagini recente » Cod sursa (job #3003409) | Cod sursa (job #1026368) | Cod sursa (job #900619) | Cod sursa (job #1693141) | Cod sursa (job #657548)
Cod sursa(job #657548)
#include <cstdio>
#include <vector>
#include <cstdlib>
#define MAX 50001
using namespace std;
vector<int> plus, minus;
int semn[MAX];
//semn = 1 pt plus
//semn = 0 pt minus
long long suma;
long long sumaPartiala;
int n;
int v[MAX];
void citire()
{
freopen("semne.in", "r", stdin);
scanf("%d %lld", &n, &suma);
for(int i = 1; i <= n; i++)
{
scanf("%d", &v[i]);
}
fclose(stdin);
}
void firstAssignment()
{
for(int i = 1; i <= n; i++)
{
if(sumaPartiala + v[i] > suma)
{
sumaPartiala -= v[i];
semn[i] = 0;
minus.push_back(i);
}
else
{
sumaPartiala += v[i];
semn[i] = 1;
plus.push_back(i);
}
}
}
void lowerSum()
{
int which = rand() % plus.size();
sumaPartiala -= (2 * v[plus[which]]);
minus.push_back(plus[which]);
semn[plus[which]] = 0;
plus[which] = plus[plus.size() - 1];
plus.pop_back();
}
void higherSum()
{
int which = rand() % minus.size();
sumaPartiala += (2 * v[minus[which]]);
plus.push_back(minus[which]);
semn[minus[which]] = 1;
minus[which] = minus[minus.size() - 1];
minus.pop_back();
}
void afisare()
{
freopen("semne.out", "w", stdout);
for(int i = 1; i <= n; i++)
{
if(semn[i])
{
printf("+");
}
else
printf("-");
}
fclose(stdout);
}
int main()
{
citire();
firstAssignment();
while(suma != sumaPartiala)
{
if(sumaPartiala > suma)
{
lowerSum();
}
else
{
higherSum();
}
}
afisare();
return 0;
}