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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值