标签:ring pre ace int panel sam 写法 algorithm ems
Input输入若干组数据.每组数据包括:导弹总个数(正整数),导弹依此飞来的高度(雷达给出的高度数据是不大于30000的正整数,用空格分隔)
Output对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统.
Sample Input
8 389 207 155 300 299 170 158 65
Sample Output
2
这里有个地方注意一下,不要把题目理解错了。不是让你查找逆序数对的个数,也是就是说 500 400 600 100 200这个数据的答案是2而不是3
好了,写一下我的思路吧。贪心,使用set找到第一大于或等于的就删掉。最后都是插入就好了。(其实保证了,数据找到自己最近的那个大于或等于的数)
废话不多说ac代码在这里
#include<cstdio> #include<algorithm> #include<cstring> #include<set> using namespace std; set<int>num; int main() { int n; while (scanf("%d", &n) != EOF) { num.clear(); int kk; scanf("%d", &kk); num.insert(kk); for (int i = 1; i < n; i++) { scanf("%d", &kk); set<int>::iterator pp = lower_bound(num.begin(), num.end(), kk); if(pp!=num.end()) { num.erase(*pp); } num.insert(kk); } printf("%d\n", num.size()); } }
第二种写法:
#include<cstdio> #include<cstring> int rin[30000]; int main(){ int T; while(scanf("%d",&T)!=EOF){ int x; int li = 0; memset(rin,0,sizeof(rin)); while(T--){ scanf("%d",&x); if(x>rin[li]){ rin[++li] = x; }else { int l = 1, r = li; while(l<r){ int mid=(r+l)/2; if(rin[mid]<x) l=mid+1; else r=mid; } rin[l]=x; } } printf("%d\n",li); } return 0; }
标签:ring pre ace int panel sam 写法 algorithm ems
原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/9477390.html