气cry~,思路完全正确,但因为实现时的一系列小问题,花了将近半个小时才A掉。
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1257
思路:每当有导弹来临时:
①如果没有任何当前的系统可以达到导弹的高度,则在拦截数组里新增一个,并且最大打击高度为导弹高度。
②如果有能达到导弹高度,则找到最接近导弹的这一点(可以使浪费的高度最小),并将导弹高度赋值给它。
现在看来用sort排序做到这一点会更好。
出现问题:
①在寻找最接近点时,一是没有注意变量的有效性,二是传送参数时出现错误,导致数组越界。
②注意是:s[find_close(height)]=height,而不是s[find_close(height)]-=height;出现这个错误是因为之前做的题让自己潜意识里少了判断。
代码如下:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=1000;
int s[maxn];
int n,m;
int find_close(int target)
{
int minu=99999;
int j;//一定要注意变量的有效性问题。
for(int i=0;i<n;i++)
{
int num=s[i]-target;
if(num>=0 && num<=minu)
{j=i;minu=num;}
}
return j;
}
int main(void)
{
int i,j,k;
int height;
while(cin>>n)
{
if(n==0) break;
memset(s,0,sizeof(s));
int cnt=0;
for(i=0;i<n;i++)
{
cin>>height;
bool flag=false;
for(j=0;j<n;j++)
{
if(s[j]>=height) flag=true;
}
if(!flag) s[cnt++]=height;
else s[find_close(height)]=height; //更新可以达到的打击高度
}
cout<<cnt<<endl;//数组为0—cnt-1,恰好有cnt个
}
}