Sunteți pe pagina 1din 2

Alpinist Bursucel s-a apucat de practicat alpinismul.

El pleac dintr-un punct situat la o altidudine de h metri i vrea s parcurg traseul prin efectuarea mai multor deplasri, ntr-un mod distractiv. Bursucel va efectua alternativ dou tipuri de deplasri: urcarea unei poriuni cu x metri sau coborrea unei poriuni de drum cu y metri. El va efectua alternativ cele dou tipuri de deplasri, ncepnd cu deplasarea tip urcare. Obiectivul lui este de a ajunge, urmnd aceste reguli, ntr-un punct situat ct mai aproape de altitudinea de z metri. Cerin Scriei un program care s determine numrul minim de deplasri pe care trebuie s le fac Bursucel pentru a ajunge ct mai aproape de punctul de altitudine de z metri, prin parcurgerea traseului dup regulile de mai sus. Determinai i altitudinea punctului la care a ajuns acesta. Date de intrare Fiierul de intrare alpinist.in conine: - pe prima linie numrul natural h, reprezentnd altitudinea punctului iniial de la care pleac Bursucel - pe a doua linie, dou numere naturale x i y, separate printr-un spaiu, reprezentnd distana (exprimat n metri) pe care Bursucel o parcurge la urcare, respectiv coborre - pe a treia linie a fiierului este scris un numr natural z, reprezentnd altitudinea punctului unde dorete s ajung. Date de ieire Fiierul de ieire alpinist.out va conine: - pe prima linie numrul minim de deplasri efectuate - pe a doua linie valoarea altitudinii punctului situat ct mai aproape de punctul unde dorete s ajung.
Restricii i precizri Exemplu
alpinist.in 10 3 7 8 alpinist.out 3 9 Explicaie Dup ce urc 3 metri, Bursucel ajunge la altitudinea de 13 metri. Apoi va cobor 7 metri, ajungnd la altitudinea de 6 metri. La a 3-a deplasare va cobor 3 metri ajungnd la altitudinea de 9 metri. Acest punct este cel mai aprioape de punctul de sosire de altitudine 8 metri.

0<h<=5000 ; 0<x<y<=100 ; 0<=z<=5000

19 5 7 4

21 4

Solu ie:
#include <stdlib.h> #include <stdio.h> #include <limits.h> long int h, x, y,z, dmin, i, k, t, kmin; FILE *fin, *fout; int main(){ fin=fopen("alpinist1.in", "r"); fscanf(fin, "%ld\n", &h); fscanf(fin, "%ld %ld\n", &x, &y); fscanf(fin, "%ld", &z); fclose(fin); fout=fopen("alpinist.out", "w"); dmin=LONG_MAX;i=1;k=h; while(i<=5000){ k=k+x; if(abs(k-z)<dmin){ kmin=k; dmin=abs(k-z); t=2*i-1; // numarul pasului } k=k-y; if(abs(k-z)<dmin){ kmin=k; dmin=abs(k-z); t=2*i; } i++; } fprintf(fout, "%ld\n%ld\n", t, kmin); fclose(fout); return 0; }

S-ar putea să vă placă și