首页 > 代码库 > nyoj 814 又见导弹拦截
nyoj 814 又见导弹拦截
又见拦截导弹
时间限制:3000 ms | 内存限制:65535 KB
难度:3
- 描述
大家对拦截导弹那个题目应该比较熟悉了,我再叙述一下题意:某国为了防御敌国的导弹袭击,新研制出来一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度。突然有一天,雷达捕捉到敌国的导弹来袭。由于该系统存在缺陷,所以如果想把所有的导弹都拦截下来,就要多准备几套这样的导弹拦截系统。但是由于该系统成本太高,所以为了降低成本,请你计算一下最少需要多少套拦截系统。
- 输入
- 有多组测试数据。
每组数据先输入一个整数N(N≤3000),代表有N发导弹来袭。接下来有N个数,分别代表依次飞来的导弹的导弹的高度。当N=-1时表示输入结束。 - 输出
每组输出数据占一行,表示最少需要多少套拦截系统。
方法一:时间为1084ms
#include<stdio.h> #include<string.h> #include<stdlib.h> int dp[3005]; int data[3005]; int main() { int n; while(scanf("%d",&n)&&n!=-1) { int i,j; for(i=0;i<n;i++) scanf("%d",&data[i]); dp[0]=1; for(i=1;i<n;i++) { dp[i]=1; for(j=0;j<i;j++) if(data[j]<data[i]&&dp[i]<dp[j]+1) dp[i]=dp[j]+1; } int maxn=dp[0]; for(i=1;i<n;i++) if(maxn<dp[i]) maxn=dp[i]; printf("%d\n",maxn); } return 0; }
方法二:时间为40ms#include<stdio.h> int main() { int n,i,j,c,a[3000],dp[3000]; while(1) { scanf("%d",&n); if(n==-1)break; for(i=0;i<n;i++) scanf("%d",&a[i]); dp[0]=a[0]; c=1; for(i=1;i<n;i++) { for(j=0;j<c;j++) if(a[i]<=dp[j]) {dp[j]=a[i];break;} if(j>=c) {dp[j]=a[i];c++;} } printf("%d\n",c); } return 0; }
方法三:与方法二类似
只是采用了二分的思想来查找第一个比他大的
时间为36ms
#include<stdio.h> #define MAX 3005 //二分查找,大于key的最小f[]的位置j int UpBinarySearch(int *upF,int l, int r, int key) { if (l<=r) { int mid = (l + r) / 2; if (upF[mid] >= key) { return UpBinarySearch(upF,l, mid-1, key); } else { return UpBinarySearch(upF, mid+1, r, key); } } else { return l; } } int main() { int a[MAX]; int f[MAX]; int aUp[MAX]; int k = 0;//length int i = 0, n=0;//loop //读入 while(scanf("%d",&n)&&n!=-1) { for (i=1; i<=n; i++) { scanf("%d",&a[i]); } //正着上升求序 f[0] = -9999; k = 0; for (i=1; i<=n; i++) { if (f[k]<a[i]) { f[++k] = a[i]; aUp[i] = k; } else { int j = UpBinarySearch(f, 0, k, a[i]); f[j] = a[i]; aUp[i] = j; } } printf("%d\n",k); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。