您的位置:首页 > 其它

hdu1257: 最少拦截系统

2012-07-25 17:53 295 查看
hdu1257: http://acm.hdu.edu.cn/showproblem.php?pid=1257
题意:导弹拦截系统:第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度,v[i]为依次发来的导弹高度,求最少需要多少套拦截系统
解法:贪心法:如对于样例,首先启动第一套,拦截前三个导弹后,限定值为155,再启动第二套,限定值为300,对于后面的导弹,采用贪心法,与前面的限定值作比较,采用限定值最接近该高度且小于该限定值的系统,如果没有这种系统,则另启动新系统。
code:


#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int v[1000],ans[1000];
bool cmp(int a,int b)
{
return a<b;
}
int main()
{
int n,k,kk,cout;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
scanf("%d",&v[i]);
k=n-1;
for(int i=0;i<n-1;i++)
if(v[i+1]>v[i])     //求出最长子序列的始点
{
k=i;
break;
}
cout=0;
ans[cout++]=v[k];
for(int i=k+1;i<n;i++)
{
sort(ans,ans+cout,cmp);      //可能数据比较少,每次都排序也没有超时,较优解法类似“嵌套娃娃”
kk=cout;
for(int j=0;j<cout;j++)
{
if(v[i]<=ans[j])      //找出最接近的限定值
{
kk=j;
break;
}
}
if(kk==cout)
ans[cout++]=v[i];
else
ans[kk]=v[i];
}
printf("%d\n",cout);
}
}
/*input:
8 389 207 155 300 299 170 158 65
output:
2*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: