Pagini recente » Cod sursa (job #2892455) | Cod sursa (job #1042848) | Cod sursa (job #2630050) | Cod sursa (job #703209) | Cod sursa (job #1520615)
#include <algorithm>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("secv.in");
ofstream g("secv.out");
int N , mx , sol = 5005;
int v[5005] , aux[5005] , nr[5005];
vector <vector <int> > dp , mat;
int caut_bin1(int val);
int caut_bin2(int val , vector<int> a);
int main() {
f >> N;
mat.resize(N + 5);
dp.resize(N + 5);
for(int i = 1 ; i <= N ; ++i) {
f >> v[i];
aux[i] = v[i];
}
sort(aux + 1 , aux + N + 1);
aux[0] = -1;
for(int i = 1 ; i <= N ; ++i) {
nr[i] = nr[i - 1];
if(aux[i] != aux[i - 1]) {
++nr[i];
}
}
for(int i = 1 ; i <= N ; ++i) {
v[i] = nr[caut_bin1(v[i])];
mx = max(mx , v[i]);
mat[v[i]].push_back(i);
}
dp[1].resize(mat[1].size());
for(int i = 0 ; i < mat[1].size() ; ++i) {
dp[1][i] = 1;
}
for(int i = 2 ; i <= mx ; ++i) {
dp[i].resize(mat[i].size());
for(int j = 0 ; j < mat[i].size() ; ++j) {
int x = caut_bin2(mat[i][j] , mat[i - 1]);
if(x == -1) {
dp[i][j] = -1;
}
else {
if(dp[i - 1][x] != -1)
dp[i][j] = dp[i - 1][x] + mat[i][j] - mat[i - 1][x];
else
dp[i][j] = -1;
}
int y = dp[i][j];
++y;
}
}
for(int i = 0 ; i < dp[mx].size() ; ++i) {
if(dp[mx][i] != -1)
sol = min(sol , dp[mx][i]);
}
if(sol == 5005)
sol = -1;
g << sol;
return 0;
}
int caut_bin1(int val) {
int i , p = 0;
for(i = 1 ; i <= N ; i <<= 1);
while(i) {
if(i + p <= N && aux[i + p] < val) {
p += i;
}
i >>= 1;
}
return p + 1;
}
int caut_bin2(int val , vector<int> a) {
int i , p = -1;
for(i = 1 ; i < a.size() ; i <<= 1);
while(i) {
if(i + p < a.size() && a[i + p] < val){
p += i;
}
i >>= 1;
}
return p;
}