Problema de pe pbinfo #3677:
Cerința:
Se dau două numere naturale n și k. Determinați cea mai mare valoare care se poate obține eliminând din numărul n exact k cifre aflate pe poziții alăturate(una după alta).
Date de intrare:
Fișierul de intrare va conține pe prima linie numărul n și pe a doua linie nunărul k.
Date de ieșire:
În fișierul de ieșire se va scrie pe prima linie valoarea cerută.
Restricții și precizări:
- n este un număr cuprins între 10 și 10^17 inclusiv.
- 1 ≤ k < numărul de cifre ale lui n.
- pentru 50 de puncte k este 1.
Exemplul 1:
cifrevecine.in
10002
3
cifrevecine.out
12
Exemplul 2:
cifrevecine.in
1938
2
cifrevecine.out
38
Răspunsuri la întrebare
Răspuns de
3
Răspuns:
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
int n,i=0, nr,k;
char a[18];
ifstream f("cifrevecine.in");
ofstream g("cifrevecine.out");
while (!f.eof())
{
i++;
f>>a[i];
}
f.close();
k=a[i-1]-'0';
n=i-2;
i=1;
while (a[i]>=a[i+k] && i+k<n) i++;
if(i+k<n)
{for (nr=1;nr<i;nr++) g<<a[nr];
for (nr=i+k;nr<=n;nr++) g<<a[nr];
}
else
if(i+k==n)
for(nr=1;nr<=i;nr++) g<<a[nr];
else
for(nr=1;nr<n;nr++) g<<a[nr];
g.close();
}
Explicație:
Solutie de 95 p. Nu-mi dau seama ce caz exceptional nu este inclus aici...
Ionut945:
ok...multumesc mult!!! oare daca vei reusi sa faci solutia de 100 de puncte ai putea sa mi-o trimiti si mie?
using namespace std;
ifstream fin("cifrevecine.in");
ofstream fout("cifrevecine.out");
int maxnumber(unsigned long long int n, int k)
{
for (int j = 0; j < k; j++) {
int ans = 0;
int i = 1;
while (n / i > 0) {
int temp = (n / (i * 10)) * i + (n % i);
i *= 10;
ans = max(ans, temp);
}
n = ans;
}
return n;
}
int main()
{
unsigned long long int n;
int k;
fin >> n >> k;
fout << maxnumber(n, k) << endl;
return 0;
}
Alte întrebări interesante
Limba română,
8 ani în urmă
Matematică,
8 ani în urmă
Limba română,
8 ani în urmă
Matematică,
8 ani în urmă
Engleza,
9 ani în urmă
Matematică,
9 ani în urmă