1 条题解

  • 0
    @ 2025-6-10 20:40:42

    题意分析

    题目要求计算防御导弹CATCHER在每次测试中最多能拦截的来袭导弹数量。CATCHER的限制条件为:初始可发射到任意高度,但后续只能拦截高度不超过上一枚拦截导弹的目标。输入为多组测试数据,每组包含一系列非负整数(导弹高度),以-1结束;若首个值为-1则终止程序。输出每组测试中CATCHER能拦截的最大导弹数,需按指定格式输出并在测试间留空行。

    解题思路

    代码采用动态规划求解最长不增子序列(LDS):1)用数组arrarr存储导弹高度,dp[i]dp[i]表示以第ii枚导弹结尾的最长不增子序列长度;2)对每个位置jj,遍历其前所有位置kk,若arr[j]arr[k]arr[j] \leq arr[k]dp[k]dp[k]更大,则更新dp[j]=dp[k]+1dp[j] = dp[k] + 1;3)最终结果为所有dp[i]dp[i]的最大值。算法时间复杂度为O(n2)O(n^2),需注意输入处理和边界条件(如首个值为-1时终止)。

    #include<stdio.h>
    int arr[10010];
    int dp[10010];
    int main()
    {
    
    	int ncase = 1;
    	while (1)
    	{
    		int i = 0;
    		int len;
    		arr[0] = 0;
    		while (arr[i] > -1)
    		{
    			i++;
    			scanf("%d", &arr[i]);
    		}
    		if (i == 1)
    			break;
    		for (len = 1; len < i; len++)
    			dp[len] = 1;
    		len--;
    		for (int j = 2; j <= len; j++)
    		{
    			int temp = 0;
    			for (int k = j - 1; k >= 1; k--)
    			{
    				if (arr[j] < arr[k] && temp < dp[k])
    				{
    					temp = dp[k];
    				}
    			}
    			if (temp != 0)
    				dp[j] = temp + 1;
    		}
    		int ans = 0;
    		for (i = 1; i <= len; i++)
    			if (ans < dp[i])
    				ans = dp[i];
    		printf("Test #%d:\n", ncase++);
    		printf("  maximum possible interceptions: %d\n\n", ans);
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    888
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者