Cioc
Cioc, un elev abia aterizat în clasa a IX-a, primește de la doamna profesor de informatică un șir de n numere naturale pe care trebuie să îl prelucreze. Astfel, băiatul trebuie să scrie după fiecare dintre cele k cele mai mici elemente dublul lor. Dacă cel mai mare dintre aceste numere se repetă și deja se depășesc cele k elemente prevăzute, doamna profesor îi dă libertatea băiatului de a modifica valoarea lui k astfel încât să cuprindă și aceste valori. De exemplu, dacă n = 7, v[] = {1, 4, 6, 2, 3, 4, 5} și k = 4, atunci, în urma prelucrării, șirul v devine {1, 2, 4, 8, 6, 2, 4, 3, 6, 4, 8, 5}, și deci kfinal=5.
Cerința
Cunoscându-se n, șirul v și k, să se afișeze:
1. Numărul kfinal;
2. Vectorul după prelucrare.
Date de intrare
Fișierul de intrare cioc.in conține pe prima linie numerele c (mereu 1 sau 2, reprezentând cerința ce trebuie rezolvată), n, k, iar următoarea linie va conține n numere întregi, reprezentând elementele vectorului inițial.
Date de ieșire
Fișierul de ieșire cioc.out va conține pe prima linie:
Dacă c = 1, atunci numărul kfinal;
Dacă c = 2, atunci vectorul după prelucrare.
Restricții și precizări
1 ≤ n, k ≤ 100.000;
1≤v[i]≤260;
Pentru 40% din teste, c=1.
Exemplu
cioc.in
1 7 4
1 4 6 2 3 4 5
cioc.out
5
Explicație
k-ul inițial nu este suficient de cuprinzător (numărul 4 se repetă).
cioc.in
2 7 4
1 4 6 2 3 4 5
cioc.out
1 2 4 8 6 2 4 3 6 4 8 5
Explicație
Acesta este exemplul din enunț.
Răspunsuri la întrebare
Răspuns:
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("cioc.in");
ofstream fout("cioc.out");
int n,i,k,c, kfinal;
long long v[100002], a[100002], maxk;
int main()
{
fin >> c >> n >> k;
for (i=0; i<n; ++i)
{
fin >> v[i];
a[i]=v[i];
}
sort(a, a+n);
while (a[k]==a[k-1] && k<n) ++k;
kfinal=k; maxk=a[k-1];
if (c==1) fout << kfinal;
else
{
for (i=0; i<n; ++i)
{
fout << v[i] << " ";
if (v[i]<=maxk) fout << 2*v[i] << " ";
}
}
}
Explicație:
100 f.f. proaspăt.. :))) Nu am aplicat Divide et Impera şi a mers rapid
#include <fstream>// ifstream si ofstream
#include <algorithm>// sort()
using namespace std;
long long vec[100001]; // vectorul initial
long long srtvec[100001]; // vectorul sortat
long long mod[200001]; // vectorul modificat
int main(){
int c,n,k;
ifstream fin("cioc.in");
ofstream fout("cioc.out");
fin >> c >> n >> k;
for(int i = 1; i <= n; i++){
fin >> vec[i];
srtvec[i] = vec[i];
}
fin.close();
sort(&srtvec[1], &srtvec[n+1]);
if(c==1){
int kf = k;
long long v = srtvec[k];
while(srtvec[++kf] == v);
fout << --kf;
}else{//c=2
long long int vm = srtvec[k];
int poz = 0;
for(int i = 1; i <= n; i++){
mod[poz++] = vec[i];
if(vec[i] <= vm){
mod[poz++] = vec[i] * 2;
}
}
for(int i = 0; i < poz; i++){
fout << mod[i] << ' ';
}
}
fout.close();
}