jx_kingwei的专栏

碧海潮生的小屋

TOJ1004 防御导弹问题

/*


防御导弹

http://acm.tongji.edu.cn/people/ps/showproblem.php?problem_id=1004


Time Limit:1s Memory Limit:1000k
Total Submit:4585 Accepted:1439


Time Limit:1s Memory Limit:1000k
Total Submit:4585 Accepted:1439


Time Limit:1s Memory Limit:1000k
Total Submit:4585 Accepted:1439

--------------------------------------------------------------------------------

Problem
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够达到任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在使用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

Input
最多20个整数,分别表示导弹依次飞来的高度(雷达给出高度数据是不大于30000的正整数)

Output
两个整数M和N。表示:这套系统最多能拦截 M 枚导弹,如果要拦截所有导弹最少要配备 N 套这种导弹系统。

Sample Input
300 250 275 252 200 138 245

Sample Output
5 2

*/

#include <stdio.h>

int main()
{
 int decv[20], decx[20];
 int height[20], mask[20];
 int i, j, M, N, count, left, max, idx;
 
 count = 0;
 while (scanf("%d", &height[count]) != EOF)
  count++;
  
 for (i=0; i<count; i++)
  mask[i] = 1;
  
 left = count;
 M = N = 0;
 while (left > 0)
 {
  max = 0;
  for (i=count-1; i>=0; i--)
   if (mask[i])
   {
    decv[i] = 1;
    decx[i] = -1;
    for (j=i+1; j<count; j++)
     if (mask[j])
     {
      if (height[i] >= height[j] && decv[i] < 1+decv[j])
      {
       decv[i] = 1+decv[j];
       decx[i] = j;
      }
     }
    if (max < decv[i])
    {
     max = decv[i];
     idx = i;
    }
   }
   
  if (M < max)
   M = max;
   
  left -= max;
  N++;
  i = idx;
  while (i != -1)
  {
   mask[i] = 0;
   i = decx[i];
  }
 }
 printf("%d %d/n", M, N);

 return 0;
}

阅读更多
文章标签: output input
个人分类: 算法相关
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

TOJ1004 防御导弹问题

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭