首页 > 代码库 > hdu 1257 LIS (略坑5

hdu 1257 LIS (略坑5

---恢复内容开始---

最少拦截系统 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 38242 Accepted Submission(s): 15029 Problem Description

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.

某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹. 怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,

请帮助计算一下最少需要多少套拦截系统.

Input 输入若干组数据.每组数据包括:导弹总个数(正整数),导弹依此飞来的高度(雷达给出的高度数据是不大于30000的正整数,用空格分隔)

Output 对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统. Sample Input 8 389 207 155 300 299 170 158 65 Sample Output 2

最开始想的便是lis,不过貌似跑偏了,计算出最大反序lis,然后根据标记查找最少需要几台,不过算法有问题巴拉巴拉不过-。-;

神测试数据:10 3 6 5 3 2 1 0 5 4 3 答案应是2(65543/33210),按我的就是3(hhhh

好吧然后就是贪心了,先把第一胎加入系统数组中,接着如果后面的比他小/==便无需在新购一台,更改比他大的最小机器即可,

反之加入一台新机器。大小就是他,不过貌似不用每次sort,因为按照这个逻辑机器的顺序恰是升序嘻嘻; 代码:

#include<bits/stdc++.h>

using namespace std;

int main() {

int i,j,n,k,l,sum,a[1005],temp[1005]; //a[i]也不必开数组

while (cin>>n){ sum=-1;

for (i=1;i<=n;i++){

int flag=1;

cin>>a[i];

if (i==1) temp[++sum]=a[i];

for (j=0;j<=sum;j++){

if (temp[j]>=a[i]) {

temp[j]=a[i];

flag=0;

break; } }

if (flag) temp[++sum]=a[i]; //加入新机器中

}

cout<<sum+1<<endl; }

return 0; }

然后发现麻麻的直接求一遍lis就ac了汗死:

#include<bits/stdc++.h>

using namespace std;

int lis(int n,int a[]) {

int i,j,macn,dp[1005]={0},sum=0;

for (i=1;i<=n;i++) {

macn=0; for (j=1;j<i;j++) {

if (a[j]<a[i]&&dp[j]>macn) macn=dp[j];

}

dp[i]=macn+1;

sum=max(sum,dp[i]); }

return sum; }

int main() {

int a[1005],n,i,j;

while (cin>>n){

for (i=1;i<=n;i++)

cin>>a[i];

cout<<lis(n,a)<<endl; }

return 0; } 炮弹发射高度递减,如果后面一台大于前面的高度,就不能拦截后面的这台,所以要多一台系统

简单证明: a b c d 假设a<c<d, 则b>d/b<a,

当b>d时,此时a/bc/d 三台;

当b<a时,此时ab/c/d三台

所以b总可与左边或右边的结合为一台;

---恢复内容结束---

hdu 1257 LIS (略坑5