这题比较简单,主要是list.sort的运用,策略:先将导弹的射程高度从大到小排序,之前需要记录导弹发射时时间上的相对位置。然后对排好序的list遍历,每次找到所有比开头导弹射程高度小的最大的导弹,删除这些导弹,设置一个拦截,然后重复,直到list为空。
这题主要时list 的运用不太熟练,首先时删除的时候iterator要自加,详情看代码。然后突然想起昨天的一题TLE会不会也是这个原因?可是找不到代码了。。。
#include<iostream>
#include<cstdio>
#include<list>
#include<cstring>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1e5+50;
int n,a[maxn],lo[maxn],cnt,h,no;
struct dan{
int height,loc;
dan(int hh,int ll):height(hh),loc(ll){}
dan(){}
/*static bool cmp(dan a,dan b){
return a.height>b.height;
}*/
};
bool cmp(dan a,dan b){
return a.height>b.height;
}
int main(){
while(scanf("%d",&n)!=EOF){
list<dan> l;
for(int i=0;i<n;i++){
int h;
scanf("%d",&h);
l.push_back(dan(h,i));
}
l.sort(cmp);///list.sort可以自己重写方法
list<dan>::iterator it;
cnt=0;
while(l.size()){
no=-1;
h=inf;
cnt++;
for(it=l.begin();it!=l.end();){
if((*it).height<=h&&(*it).loc>no){
h=(*it).height;
no=(*it).loc;
l.erase(it++);///这里需要注意
}
else it++;///同上
}
}
printf("%d\n",cnt);
}
return 0;
}