Răspuns :
Prima problema:
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ofstream fout("prob.out");
ifstream fin("prob.in");
const int NMAX = 10000;
int n, x, nr, Max, poz_init;
int lg[NMAX], poz[NMAX];
vector<int> v;
void lis()
{
for(int i=n-1; i>=0; i--) {
for(int j=i+1; j<n; j++)
if(v[i] < v[j] && lg[i] <= lg[j])
lg[i] = lg[j] + 1, poz[i] = j;
if(Max < lg[i]) Max = lg[i], poz_init = i;
}
nr++;
}
void sterge()
{
int k = 0;
for(int i=poz_init; i != -1; i = poz[i]) {
v.erase(v.begin() + i + k);
k--;
}
n += k;
}
int main()
{
fin >> n;
for(int i=0; i<n; i++) fin >> x, v.push_back(x);
while(!v.empty()) {
fill(lg, lg + n, 1), fill(poz, poz + n, -1);
Max = poz_init = 0;
lis();
sterge();
}
fout << nr << '\n';
return 0;
}
A doua problema: (data viitoare cand pui mai multe probleme la un loc, ofera si tu mai multe puncte :)) )
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ofstream fout("date.out");
ifstream fin("date.in");
int n, sol;
vector<float> v;
void citire()
{
int x, y;
fin >> n;
for(int i=1; i<=n; i++) {
float nr;
fin >> x;
fin.get();
fin >> y;
nr = (float)x / y;
v.push_back(nr);
}
sort(v.begin(), v.end());
}
void rezolva()
{
float suma = 0;
while(!v.empty()) {
float aux = v.front();
if(aux + suma >= 1) sol++, suma = 0;
else {
suma += aux;
v.erase(v.begin());
}
}
fout << sol << '\n';
}
int main()
{
citire();
rezolva();
return 0;
}
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ofstream fout("prob.out");
ifstream fin("prob.in");
const int NMAX = 10000;
int n, x, nr, Max, poz_init;
int lg[NMAX], poz[NMAX];
vector<int> v;
void lis()
{
for(int i=n-1; i>=0; i--) {
for(int j=i+1; j<n; j++)
if(v[i] < v[j] && lg[i] <= lg[j])
lg[i] = lg[j] + 1, poz[i] = j;
if(Max < lg[i]) Max = lg[i], poz_init = i;
}
nr++;
}
void sterge()
{
int k = 0;
for(int i=poz_init; i != -1; i = poz[i]) {
v.erase(v.begin() + i + k);
k--;
}
n += k;
}
int main()
{
fin >> n;
for(int i=0; i<n; i++) fin >> x, v.push_back(x);
while(!v.empty()) {
fill(lg, lg + n, 1), fill(poz, poz + n, -1);
Max = poz_init = 0;
lis();
sterge();
}
fout << nr << '\n';
return 0;
}
A doua problema: (data viitoare cand pui mai multe probleme la un loc, ofera si tu mai multe puncte :)) )
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ofstream fout("date.out");
ifstream fin("date.in");
int n, sol;
vector<float> v;
void citire()
{
int x, y;
fin >> n;
for(int i=1; i<=n; i++) {
float nr;
fin >> x;
fin.get();
fin >> y;
nr = (float)x / y;
v.push_back(nr);
}
sort(v.begin(), v.end());
}
void rezolva()
{
float suma = 0;
while(!v.empty()) {
float aux = v.front();
if(aux + suma >= 1) sol++, suma = 0;
else {
suma += aux;
v.erase(v.begin());
}
}
fout << sol << '\n';
}
int main()
{
citire();
rezolva();
return 0;
}