十三届蓝桥杯-c组-最大不下降子序列

题目详情

【问题描述】

给定一个长度为 N 的整数序列:A1, A2, · · · , AN。现在你有一次机会,
将其 中连续的 K 个数修改成任意一个相同值。请你计算如何修改可以
使修改后的数 列的最长不下降子序列最长,请输出这个最长的长度。
最长不下降子序列是指序列中的一个子序列,子序列中的每个数不小于在它之前的数。

【输入格式】

    输入第一行包含两个整数 N 和 K。
    第二行包含 N 个整数 A1, A2, · · · , AN。

【样例输入】

	5 1
	1 4 2 8 5

【样例输出】

	4

解题思路

因本人比较菜,动态规划有点玩不明白,所以在此出了一种不需要动态规划,也不要需要找状态转移方程的方法
首先我们要定义两个int类型的变量,用来存放N和K

static int n,k;

接下来定义两个数组,一个为int型,一个为Boolean型,作用介绍在代码里:

static int[] arr;//用来存放所输入的数字
static boolean[] c;//用来判断所输入的数组两个值之间的递增关系;是了为true;否之为false

我们变量命名好之后,接着就该给变量赋值,这里我要引用到java.until.Scanner包(及从键盘获取输入的一个包)复制代码如下:

Scanner scan = new Scanner(System.in);
n=scan.nextInt();//获取样例输入的第一行
k=scan.nextInt();//n,k分别为数组的长度和我们所需要调整的数字个数
for (int i = 0; i < n; i++) {
     arr[i]= scan.nextInt();
  }//从键盘获取输入样例的第二行

我们引入数值后,就可以给我们的Boolean数组赋值,代码如下

for (int i = 1; i < n; i++) {
     if (arr[i]<arr[i-1]){//数组不为递增时
          c[i]=false;
       }else {
          c[i]=true;//数组为递增时
       }
  }

这样我们Boolean类型的数组复制完毕了,接下来我们定义一个max变量用来计算我们的最大下降序列,代码如下:

int max = 0;
for (int i = 0; i < n; i++) {
     if(k>0){//因为我们可以调整k个值,所以分为k>0和K=0两种情况
     	if (c[i]){//当c[i]为true的时候,说明序列为增,即max+1
        	max++;
         }else{
         	k--;//当从c[i]为false的时候,说明序列为递减,既要调正这个数字,所以要k--是为了记录我们可调数字的个数
            max++;//当我们调整过后,数列又为递增序列,所以max的值又要+1
         }
      }else if (k==0){//当k=0时;及我们没有办法再去调整递减的值
            if (c[i]){//所以当c[i]为true的时候,我们把max的值+1即可
                max++;
            }else{//当c[i]为false的时候我们无法改变值,所以遍历结束
              System.out.println(max);//输出所获得的不递减子序列
              break;//结束循环
            }
         }
 }

完整代码如下:

import java.util.Scanner;

public class Main {
  static  int N=1000000;//因为题目的最大测例为1000000;所以我们设置数组的大小为1000000
  static int[] arr = new int[N];//存放初始值
  static boolean[] c = new boolean[N];//用来判断序列是否上升
  static long n,k;

  public static void main(String[] args) {
      Scanner scan = new Scanner(System.in);
      n = scan.nextInt();
      k = scan.nextInt();
      c[0]=true;
      for (int i = 0; i < n; i++) {
          arr[i]= scan.nextInt();
      }
      for (int i = 1; i < n; i++) {
          if (arr[i]<arr[i-1]){
              c[i]=false;
          }else {
              c[i]=true;
          }
      }
      int max = 0;
      for (int i = 0; i < n; i++) {
          if(k>0){
              if (c[i]){
                  max++;
              }else{
                  k--;
                  max++;
              }
          }else if (k==0){
              if (c[i]){
                  max++;
              }else{
                  System.out.println(max);
                  break;
              }

          }
      }
  }
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 第十三届蓝桥杯研究生组C是中国计算机教育著名的比赛之一,全称为“全国计算机等级考试蓝桥杯全国软件和信息技术专业人才大赛研究生组C赛题”。此次比赛的赛题主要面向软件开发这一领域,涵盖了多种技术方向,包括Java、C++、Python、机器学习、分布式计算、区块链等等。 此次比赛旨在鼓励研究生参与实际项目开发,培养学生解决实际问题的能力和实践经验,同时也为企业提供一批高水平的技术人才。比赛内容难度较高,需要参赛者具备较高的技术水平和实际开发经验。 同样,第十三届蓝桥杯研究生组C也是一次充满挑战和机遇的比赛,参赛者需要克服技术难题,理解业务需求,开发出高质量的软件产品,同时还需要注意代码规范,注重代码可读性和可维护性。通过本次比赛,研究生们不仅能够提高自己的技术能力和实践经验,还能够结交同行业的优秀人才,扩展自己的人脉和职业发展空间。 总之,第十三届蓝桥杯研究生组C是一次充满挑战和机遇的比赛,期待更多的研究生参与其中,展现自己的才华和实力,为中国软件开发行业的发展做出贡献。 ### 回答2: 第十三届蓝桥杯研究生组C题是一道关于动态规划算法的题目,题目难度较大,需要研究生具备扎实的算法基础和编程基础。 这道题目要求我们设计一个程序,计算从一个正方形棋盘左上角到右下角的所有路径中,经过任意1个格的路径的总数。具体来说,我们需要使用动态规划的思想,利用空间换时间的策略,在棋盘上填表,记录每个格前面路径中经过的格数量,使得遍历表格时能够快速计算各个格之间的相关关系,从而求得最终结果。 本题的难点在于需要设计出时间复杂度为O(n^2)的算法,需要学生具备较高的算法设计和分析能力。同时,由于本题考察的是研究生学生的素质,除了算法的正确性,良好的代码风格和工程能力也是评价标准之一。因此,在解题过程中,应当注意代码的规范性和可读性,编写注释,并遵循良好的编码规范,以展示出研究生的优秀素质。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值