URGENT!!! 50 de puncte!!! Cerința În această problemă veţi primi două numere natural N, şi K. Definim magnitudinea unui număr ca fiind diferenţa dintre cifra maximă şi cifra minimă ale lui. De exemplu, magnitudinea lui 9748 este 9 – 4 = 5. Eliminaţi maxim K cifre din numărul N, astfel încât magnitudinea numărului obţinut să fie cât mai mică. Date de intrare În fișierul magnitudine.in se află pe prima linie numerele N si K separate prin spaţii. Date de ieșire Afișați în fișierul magnitudine.out magnitudinea minimă care se poate obţine după eliminarea a K cifre ale lui N. Restricții și precizări 1 ≤ N ≤ 10 ^ 18 pentru teste în valoare de 30 puncte, K = 0 pentru teste în valoare de 30 puncte, K = 1 pentru teste în valoare de 40 puncte, K = 2
C++
https://www.pbinfo.ro/?pagina=probleme&id=2298
ated:
daca vrei de 90 de puncte ti-o dau
Răspunsuri la întrebare
Răspuns de
6
Am reusit intr-un final sa o fac de 100p.
#include <iostream>
#include <fstream>
using namespace std;
int minim(int v[], int n)
{
int min = 10;
for (int i = 9; i >= 0; i--)
if (v[i] && i < min)
min = i;
return min;
}
int maxim(int v[], int n)
{
int max = -1;
for (int i = 0; i <= 9; i++)
if (v[i] && i > max)
max = i;
return max;
}
int v[10];
int main()
{
ifstream in("magnitudine.in");
ofstream out("magnitudine.out");
unsigned long long n;
int k, x[10], y[10], m1, m2, m3 = 10;
in >> n >> k;
while(n)
{
v[n % 10]++;
n /= 10;
}
for (int i=0; i<10; i++)
{
x[i] = v[i];
y[i] = v[i];
}
// Incerci sa scazi magnitudinea stergand cifra minima
for (int i=0; i<k; i++)
x[minim(x, 10)]--;
m1 = maxim(x, 10) - minim(x, 10);
// Incerci sa scazi magnitudinea stergand cifra maxima
for (int i=0; i<k; i++)
v[maxim(v, 10)]--;
m2 = maxim(v, 10) - minim(v, 10);
if (k == 2)
{
// Se sterge cifra minima si cifra maxima, de ex. pentru 1459 (cazul pt. 100p)
y[maxim(y, 10)]--;
y[minim(y, 10)]--;
m3 = maxim(y, 10) - minim(y, 10);
}
if (m2 > m3)
swap(m2, m3);
if (m1 > m2)
swap(m1, m2);
if (m1 > m3)
swap(m1, m3);
out << m1;
return 0;
}
#include <iostream>
#include <fstream>
using namespace std;
int minim(int v[], int n)
{
int min = 10;
for (int i = 9; i >= 0; i--)
if (v[i] && i < min)
min = i;
return min;
}
int maxim(int v[], int n)
{
int max = -1;
for (int i = 0; i <= 9; i++)
if (v[i] && i > max)
max = i;
return max;
}
int v[10];
int main()
{
ifstream in("magnitudine.in");
ofstream out("magnitudine.out");
unsigned long long n;
int k, x[10], y[10], m1, m2, m3 = 10;
in >> n >> k;
while(n)
{
v[n % 10]++;
n /= 10;
}
for (int i=0; i<10; i++)
{
x[i] = v[i];
y[i] = v[i];
}
// Incerci sa scazi magnitudinea stergand cifra minima
for (int i=0; i<k; i++)
x[minim(x, 10)]--;
m1 = maxim(x, 10) - minim(x, 10);
// Incerci sa scazi magnitudinea stergand cifra maxima
for (int i=0; i<k; i++)
v[maxim(v, 10)]--;
m2 = maxim(v, 10) - minim(v, 10);
if (k == 2)
{
// Se sterge cifra minima si cifra maxima, de ex. pentru 1459 (cazul pt. 100p)
y[maxim(y, 10)]--;
y[minim(y, 10)]--;
m3 = maxim(y, 10) - minim(y, 10);
}
if (m2 > m3)
swap(m2, m3);
if (m1 > m2)
swap(m1, m2);
if (m1 > m3)
swap(m1, m3);
out << m1;
return 0;
}
Alte întrebări interesante
Chimie,
8 ani în urmă
Chimie,
8 ani în urmă
Limba română,
8 ani în urmă
Limba română,
9 ani în urmă
Limba română,
9 ani în urmă
Matematică,
9 ani în urmă
Matematică,
9 ani în urmă