infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Adrian Diaconu din Martie 28, 2009, 13:41:37



Titlul: 791 Center
Scris de: Adrian Diaconu din Martie 28, 2009, 13:41:37
Aici puteti discuta despre problema Center (http://infoarena.ro/problema/center).


Titlul: Răspuns: 791 Center
Scris de: Savin Tiberiu din Martie 28, 2009, 15:24:37
"distanta afisata nu corespunde distantei calculate" -> inteleg ca asta inseamna WA dar e destul de dubios mesajul. Am busit prima valoare? a doua? sau amandoua?

Citat
Afisati capatul stanga cu cat mai multe zecimale (cel putin 8).
...
Primiti punctajul corespunzator unui test daca pentru ambele cerinte diferenta absoluta dintre rezultatul corect si cel afisat este cel mult 0.01.

Putin cam confusing. De ce trebuie sa afisez cel putin 8 zecimale daca diferenta absoluta dintre rezultatul corect si cel afisat trebuie sa fie 0.01? Cred ca a doua propozitie e valabila numai pentru prima cerinta.


Titlul: Răspuns: 791 Center
Scris de: Pripoae Teodor Anton din Martie 28, 2009, 16:58:36
Nu am citit cu atentie problema, iar verificatorul nu e scris de mine personal, dar uite sursa lui. Din ce vad eu, acel mesaj este afisat atunci cand diferenta dintre dmin si dmax (care se calculeaza in functie de cele 2 valori afisate de tine) e mai mare decat eroarea tolerata.

Cod:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define NMAX 1001000
#define eps 1e-6
#define deps 0.01

long long x[NMAX], w[NMAX], A, B, C, D;
double dmin, xpos, d, dmax, dok;
int i, j, k, N, L, local_side, side;

#define minim(a,b) ((a) < (b) ? (a) : (b))
#define maxim(a,b) ((a) > (b) ? (a) : (b))

void err(int p, char *msg)
{
fprintf(stderr, msg); 
printf("%d", p); 
fflush(stdout);
exit(0);
}

int main()
{
freopen("center.in", "r", stdin);

scanf("%d %d %lld %lld %lld %lld %lld", &N, &L, &w[1], &A, &B, &C, &D);
x[1] = 0;

for (i = 2; i <= N; i++)
{ // good rule ?
x[i] = x[i - 1] + 1 + (((x[i - 1] * i) ^ A) % B);
//w[i] = 1 + ((((w[i - 1] * B) ^ (long long) (i * D)) % minim(i, N - i + 1)));
if (2 * i <= N)
k = 1;
else
k = -1;

w[i] = maxim(1, w[i - 1] + k * (1 + (((w[i - 1] * (i + C)) ^ (D * i)) % D)));
C = 1 + ((((C * C) % D) * i) % D);
}

freopen("center.out", "r", stdin);

if (scanf("%lf %lf", &dmin, &xpos) != 2)
err(0, "fisier de iesire lipsa sau incomplet");

dmax = 0.0;
for (i = 1; i <= N; i++)
{
if (((x[i] > xpos) || (fabs((double) x[i] - xpos) < eps)) &&
((x[i] < xpos + L) || (fabs((double) x[i] - xpos - L) < eps)))
d = 0;
else
if (x[i] < xpos)
d = w[i] * (xpos - x[i]),
local_side = 1;
else
d = w[i] * (x[i] - xpos - L),
local_side = 2;

//fprintf(stderr, "%.6lf\n", d);

if (d > dmax)
dmax = d,
k = i,
side = local_side;
}

freopen("center.ok", "r", stdin);
scanf("%lf", &dok);

//fprintf(stderr, "dmax(xpos=%.3lf)=%.3lf (k=%d, side=%d) -- dmin=%.3lf -- dok=%.3lf\n", xpos, dmax, k, side, dmin, dok);
//fprintf(stderr, "dif(dmax,dmin)=%.6lf\n", fabs(dmax - dmin));
//fprintf(stderr, "dif(dmax,dok)=%.6lf\n", fabs(dmax - dok));
//fprintf(stderr, "dif(dmin,dok)=%.6lf\n", fabs(dmin - dok));

if (fabs(dmin - dmax) > deps)
err(0, "distanta afisata nu corespunde distantei calculate");
else
if (fabs(dok - dmax) > deps)
err(0, "distanta incorecta");
else
err(10, "Okay!!");

return 0;
}


Titlul: Răspuns: 791 Center
Scris de: Rares Buhai din Martie 21, 2014, 01:00:03
Cred ca limita de timp la aceasta problema este prea mica.


Titlul: Răspuns: 791 Center
Scris de: Heidelbacher Andrei din Martie 21, 2014, 13:25:55
Am marit limita de timp. Acum ar trebui sa fie ok.

Multumim pentru sesizare.