打卡信奥刷题(1420)用C++实现信奥 B4310 [蓝桥杯青少年组国赛 2024] 第五题

B4310 [蓝桥杯青少年组国赛 2024] 第五题

题目描述

给定包含 nnn 个整数的数列,从中选取一段连续子数列,使其元素之和能被 kkk 整除。

请找出符合要求的最长连续子数列并输出其长度以及子数列本身;如果符合要求的最长连续子数列有多个,则输出起始位置最靠后的那个子数列。如果不存在符合要求的子数列,则输出 −1-11

例如:当 n=7n=7n=7k=7k=7k=7,数列为 777333444111555141414999 时:

  • 连续子数列 {7}\{7\}{7}{7,3,4}\{7,3,4\}{7,3,4}{3,4}\{3,4\}{3,4}{5,14,9}\{5,14,9\}{5,14,9} 的和都能被 777 整除;
  • 其中最长的连续子数列有 {7,3,4}\{7,3,4\}{7,3,4}{5,14,9}\{5,14,9\}{5,14,9},起始位置最靠后的是 {5,14,9}\{5,14,9\}{5,14,9}
  • 故符合要求的最长连续子数列长度为 333,子数列为 555 141414 999

输入格式

  • 第一行输入两个整数 nnnkkk1≤n≤1051 \leq n \leq 10^51n1052≤k≤1082 \leq k \leq 10^82k108),整数之间以一个空格隔开;
  • 第二行输入 nnn 个整数(1≤1 \leq1 整数 ≤104\leq 10^4104),整数之间以一个空格隔开。

输出格式

如果存在符合要求的最长连续子数列,则输出为两行:

  1. 第一行输出一个整数,表示最长连续子数列的长度;
  2. 第二行输出若干个整数,表示起始位置最靠后的最长连续子数列,整数之间以一个空格隔开。

如果不存在符合要求的子数列,则输出 −1-11

输入输出样例 #1

输入 #1

7 7
7 3 4 1 5 14 9

输出 #1

3
5 14 9

C++实现

#include<bits/stdc++.h>
using namespace std;
int n,k;
int a[100001],dp[100001];
int start=0,endd=0,maxans=0;
signed main(){
	ios::sync_with_stdio(0),cin.tie(0);
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		dp[i]=dp[i-1]+a[i];
	}
	for(int i=n;i>=1;i--){//长度 
		for(int j=n;j>=i;j--){//终点 
			if((dp[j]-dp[j-i])%k==0){
				cout<<i<<"\n";
				for(int k=j-i+1;k<=j;k++){
					cout<<a[k]<<' ';
				}return 0;
			}
		} 
	}
	if(maxans==0){
		cout<<-1;
		return 0;
	}
	return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值