Pagini recente » Cod sursa (job #1332963) | Cod sursa (job #2312465) | Cod sursa (job #947661) | Cod sursa (job #1068381) | Cod sursa (job #340335)
Cod sursa(job #340335)
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define MAX_N 50010
int poz[MAX_N], neg[MAX_N];
int vp[MAX_N], vn[MAX_N], semn[MAX_N];
int v[MAX_N];
int n, s, sum;
void cit() {
freopen("semne.in", "r", stdin);
freopen("semne.out", "w", stdout);
scanf("%d %d", &n, &s);
for (int i = 1; i <= n; i++) {
scanf("%d", &v[i]);
if (sum < s) {
poz[++poz[0]] = v[i];
vp[poz[0]] = i;
semn[i] = 1;
sum += v[i];
}
else {
neg[++neg[0]] = v[i];
vn[neg[0]] = i;
sum -= v[i];
}
}
}
void solve() {
srand(time(0));
while (sum != s)
if (sum < s) {
//iau din numerele negative
int k = rand() % neg[0] + 1;
sum += 2 * neg[k];
semn[vn[k]] = 1;
poz[++poz[0]] = neg[k];
vp[poz[0]] = vn[k];
if (k != neg[0]) {
neg[k] = neg[neg[0]];
vn[k] = vn[neg[0]];
}
neg[0]--;
}
else {
//iau din numerele pozitive
int k = rand() % poz[0] + 1;
sum -= 2 * poz[k];
semn[vp[k]] = 0;
neg[++neg[0]] = poz[k];
vn[neg[0]] = vp[k];
if (k != poz[0]) {
poz[k] = poz[poz[0]];
vp[k] = vp[poz[0]];
}
poz[0]--;
}
}
void write() {
for (int i = 1; i <= n; i++)
if (semn[i]) printf("+");
else printf("-");
printf("\n");
}
int main() {
cit();
solve();
write();
return 0;
}