请用c++写出一下题目代码及其注释:给你n个数,分别是a[1],a[2],...,a[n]。求一个最长的区间[x,y],使得区间中的数(a[x],a[x+1],a[x+2],...,a[y-1],a[y])的和能被7整除。输出区间长度。若没有符合要求的区间,输出0。
时间: 2023-05-22 20:01:49 浏览: 178
以下是题目代码及注释:
#include <stdio.h>
int main() {
int n, i, j, sum, max_len = 0;
int a[100000];
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
for (i = 0; i < n; i++) {
sum = 0;
for (j = i; j < n; j++) {
sum += a[j];
if (sum % 7 == 0 && j - i + 1 > max_len) {
max_len = j - i + 1;
}
}
}
printf("%d\n", max_len);
return 0;
}
/*
题目描述:
给你n个数,分别是a[1],a[2],...,a[n]。求一个最长的区间[x,y],使得区间中的数(a[x],a[x 1],a[x 2],...,a[y-1],a[y])的和能被7整除。输出区间长度。若没有符合要求的区间,输出0。
解题思路:
暴力枚举所有可能的区间,计算区间和并判断是否能被7整除,记录最长的符合要求的区间长度。
时间复杂度:
O(n^2)
*/
相关问题
用c++写出一下题目代码及其注释及其算法思想:有T组数据。 每组数据给定长度为 N的数组 A,对所有长度大于等于 k 的连续子段,取出其第 k 大放入数组 B 中。求数组 B 的第 M 大
#include <stdio.h>
#include <stdlib.h>
// 快速排序
void quick_sort(int *arr, int left, int right) {
if (left >= right) return;
int i = left, j = right, pivot = arr[left];
while (i < j) {
while (i < j && arr[j] <= pivot) j--;
arr[i] = arr[j];
while (i < j && arr[i] >= pivot) i++;
arr[j] = arr[i];
}
arr[i] = pivot;
quick_sort(arr, left, i - 1);
quick_sort(arr, i + 1, right);
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
int N, k, M;
scanf("%d%d%d", &N, &k, &M);
int *A = (int*)malloc(N * sizeof(int));
int cnt = 0;
for (int i = 0; i < N; i++) {
scanf("%d", &A[i]);
if (i >= k - 1) cnt++;
}
int *B = (int*)malloc(cnt * sizeof(int));
cnt = 0;
for (int i = 0; i < N - k + 1; i++) {
int *tmp = (int*)malloc(k * sizeof(int));
for (int j = 0; j < k; j++) {
tmp[j] = A[i + j];
}
quick_sort(tmp, 0, k - 1);
B[cnt++] = tmp[k - 1];
free(tmp);
}
quick_sort(B, 0, cnt - 1); // 对数组B进行排序
printf("%d\n", B[cnt - M]); // 输出数组B的第M大
free(A);
free(B);
}
return 0;
}
// 算法思想:
// 1. 读入T组数据
// 2. 对于每组数据,读入N、k、M和数组A
// 3. 遍历数组A,对每个长度大于等于k的连续子段取出其第k大,并放入数组B中
// 4. 对数组B进行排序
// 5. 输出数组B的第M大
请用c++写出一下题目代码及其注释:题目描述 给定一个括号序列,要求尽可能少地添加若干括号使得括号序列变得合法,当添加完成后,会产生不同的添加结果,请问有多少种本质不同的添加结果 两个结果是本质不同的是指存在某个位置一个结果是左括号,而另一个是右括号。 例如,对于括号序列(((),只需要添加两个括号就能让其合法,有以下几种不同的添加结果:()()()、()(())、(())()、(()())和((())) 输入描述 输入一行包含一个字符串 s,表示给定的括号序列,序列中只有左括号和右括号。 输出描述 输出一个整数表示答案,答案可能很大,请输出答案除以1000000007(即 10°+ 7)的余数。
/**
* 题目描述:
* 给定一个括号序列,要求尽可能少地添加若干括号使得括号序列变得合法,
* 当添加完成后,会产生不同的添加结果,请问有多少种本质不同的添加结果
* 两个结果是本质不同的是指存在某个位置一个结果是左括号,而另一个是右括号。
* 例如,对于括号序列(((),只需要添加两个括号就能让其合法,有以下几种不同的添加结果:
* ()()()、()(())、(())()、(()())和((()))
*
* 输入:
* 输入一行包含一个字符串 s,表示给定的括号序列,序列中只有左括号和右括号。
*
* 输出:
* 输出一个整数表示答案,答案可能很大,请输出答案除以1000000007(即 10^9 + 7)的余数。
*/
#include <stdio.h>
#include <string.h>
#define MOD 1000000007
int dp[205][205];
int main() {
char s[205];
scanf("%s", s);
int len = strlen(s);
memset(dp, 0, sizeof(dp));
for (int i = 1; i < len; i += 2) {
for (int j = 0; j + i < len; j += 2) {
if ((s[j] == '(' && s[j + i] == ')') || (s[j] == '[' && s[j + i] == ']')) {
dp[j][j + i] = dp[j + 1][j + i - 1] + 2;
for (int k = j; k < j + i; k += 2) {
dp[j][j + i] = (dp[j][j + i] + dp[j][k] * dp[k + 1][j + i]) % MOD;
}
}
}
}
printf("%d", dp[0][len - 1]);
return 0;
}
阅读全文