拦截导弹 (vijos1303)dp + greedy
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
样例:
INPUT OUTPUT
389 207 155 300 299 170 158 65 6(最多能拦截的导弹数)
2(要拦截所有导弹最少要配备的系统数)
#include <iostream>
using namespace std;
const int MAX = 22;
typedef struct
{
int height;
int lmax;
}dd;
dd cc[MAX];
int xt[MAX];
int main()
{
int cnt,n = 0, i, kk = 0, result = 1, tmax;
char rb;
cin>>cc[n].height;
cc[n].lmax = 1;
cnt = 0;
xt[cnt] = cc[0].height;
n++;
while(cin>>rb>>cc[n].height)
{
//===============dp=======================
cc[n].lmax = 1;
for(i = 0; i < n; i++)
if(cc[i].height >= cc[n].height)
{
if(cc[i].lmax + 1 > cc[n].lmax)
cc[n].lmax = cc[i].lmax + 1;
}
if(cc[n].lmax > result)
result = cc[n].lmax;
//================dp========================
//=================greedy====================
tmax = -1;kk = 0;
for(i = 0; i <= cnt; i++)
if(xt[i] >= cc[n].height)
if(tmax == -1 || xt[i] - cc[n].height < tmax)
{
kk = i;
tmax = xt[i] - cc[n].height;
}
if(tmax == -1)
xt[++cnt] = cc[n].height;
else
xt[kk] = cc[n].height;
//================greedy========================
n++;
}
cout<<result<<","<<cnt<<endl;
return 0;
}
using namespace std;
const int MAX = 22;
typedef struct
{
int height;
int lmax;
}dd;
dd cc[MAX];
int xt[MAX];
int main()
{
int cnt,n = 0, i, kk = 0, result = 1, tmax;
char rb;
cin>>cc[n].height;
cc[n].lmax = 1;
cnt = 0;
xt[cnt] = cc[0].height;
n++;
while(cin>>rb>>cc[n].height)
{
//===============dp=======================
cc[n].lmax = 1;
for(i = 0; i < n; i++)
if(cc[i].height >= cc[n].height)
{
if(cc[i].lmax + 1 > cc[n].lmax)
cc[n].lmax = cc[i].lmax + 1;
}
if(cc[n].lmax > result)
result = cc[n].lmax;
//================dp========================
//=================greedy====================
tmax = -1;kk = 0;
for(i = 0; i <= cnt; i++)
if(xt[i] >= cc[n].height)
if(tmax == -1 || xt[i] - cc[n].height < tmax)
{
kk = i;
tmax = xt[i] - cc[n].height;
}
if(tmax == -1)
xt[++cnt] = cc[n].height;
else
xt[kk] = cc[n].height;
//================greedy========================
n++;
}
cout<<result<<","<<cnt<<endl;
return 0;
}