fbpx

Problema #1592 – Plata – Rezolvari PBInfo

de Mihai-Alexandru

Eroul nostru, Costy merge la magazin pentru a-şi cumpăra biscuiţi. Vânzătorul îi spune că biscuţii costă S nasturi, şi că doreste ca plata lor să fie făcută cu n tipuri diferite de nasturi. De asemenea, vânzătorul precizează că ar dori ca numărul de nasturi din fiecare tip i să depăşească valoarea x[i], dar, să nu depăşească valoarea y[i]. Presupunând că baiatul are o infinitate de nasturi din fiecare tip şi că doreşte să rămână cu cât mai mulţi nasturi de tipurile n, n-1, n-2,.. în buzunar, ajutaţi-l să efectueze plata şi să pună cât mai repede mâna pe biscuiţi.

Cerința

Scrieţi un program care să determine o modalitate de plată a sumei, respectând condiţiile din enunţ.

Date de intrare

Fişierul de intrare plata.in conţine:
Pe prima linie, N S, reprezentând numărul de tipuri de nasturi şi suma care trebuie platită.
Pe următoarele N linii, două numere separate printr-un spaţiu, x[i] y[i], reprezentând numărul minim şi numărul maxim de nasturi de tipul i, care pot fi aleşi.

Date de ieșire

Fişierul de ieşire plata.out va conţine o linie cu n numere, separate prin câte un spatiu, r[1] r[2] r[3] . . . r[n] reprezentând numărul de nasturi de tipul i ales, sau cuvântul « imposibil » (fără ghilimele) dacă plata nu se poate realiza în condiţiile date.

Restricții și precizări

  • 1 <= n <= 1000
  • 1 <= x <= y <= 1000
  • 1 <= s <= 1000000
  • Nasturii au aceeaşi valoare, indiferent de tipul acestora.

Exemplu

plata.in

5 18
1 2
4 6
1 4
5 8
1 3

plata.out

2 6 4 5 1

Explicație

Eroul nostru va face plata in felul următor:
2 nasturi de tipul 1, 6 nasturi de tipul 2 , 4 nasturi de tipul 3, 5 nasturi de tipul 4, 1 nasture de tipul 5,
În total 2 + 6 + 4 + 5 + 1 = 18 nasturi
De observat că dacă se alegea soluţia : 1 6 4 6 1, aceasta nu era corectă deoarece Costy trebuia să scoată din buzunar un nasture de tip mai mare în schimbul celui de tip 1.

#include <bits/stdc++.h>
using namespace std;

ifstream cin("plata.in");
ofstream cout("plata.out");

int x[1001], y[1001];
int sp[1002];

int main()
{
    int n, s;
    cin >> n >> s;
    int smax = 0;
    int smin = 0;
    for(int i = 1 ; i <= n; ++i)
        cin >> x[i] >> y[i], smax += y[i], smin += x[i];
    for(int i = n; i >= 1; --i)
        sp[i] = sp[i+1] + x[i];
    int sum = 0;
    if(smax >= s && smin <= s)
    for(int i = 1 ; i <= n; ++i)
    {
        sum += y[i];
        if(sum + sp[i + 1] >= s)
        {
            if(sum + sp[i+1] == s)
            {
                cout << y[i] << ' ';
                for(int j = i + 1; j <= n; ++j)
                    cout << x[j] << ' ';
                i = n;
            }
            else
            {
                cout << y[i] + s - sum - sp[i + 1] << ' ';
                for(int j = i + 1; j <= n; ++j)
                    cout << x[j] << ' ';
                i = n;
            }

        }
        else
            cout << y[i] << ' ';
    }
    else
        cout << "imposibil";
    return 0;
}
Comentarii

S-ar putea sa iti placa