HDU 1257 DP + 贪心

    技术2022-05-19  20

    最少拦截系统

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4546    Accepted Submission(s): 1697

    Problem Description 某 国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能 超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹. 怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统.  

     

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

     

    Output 对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统.  

     

    Sample Input 8 389 207 155 300 299 170 158 65  

     

    Sample Output 2  

     

    Source 浙江工业大学第四届大学生程序设计竞赛  

     

    Recommend JGShining
    改天要研究一下 优先队列与贪心 /* 若N个数 为递增序列 则最多需要N个导弹系统 */ #include <stdio.h> #define MAX 100000 int height[MAX];//height[i]表示第i个防导弹系统所能防御的最大高度 int t; //t个数 int high;//height[i]中 最高高度 的 下标 int a[MAX]; int main(){ freopen("1257.txt","r",stdin); int i,j;//j 导弹系统个数 while(scanf("%d",&t)!= EOF){ scanf("%d",&a[0]); height[0] = a[0]; high = 0; j = 1; for(i = 1; i < t; i++){ scanf("%d",&a[i]); if(a[i] >= height[high]){ height[j++] = a[i]; if(height[j - 1] > height[high]){ //更新high值 high = j - 1; } } else { int k,min = 0X7FFFFFFF,min_index; for(k = 0; k < j; k++){ if(height[k] >= a[i] && min > height[k] - a[i]){ min = height[k] - a[i]; min_index = k; } } height[min_index] = a[i]; } } printf("%d/n",j); } getch(); return 0; }

    最新回复(0)