3月16日打卡
代码问题:
最大值
作者: frankhuhu
时间限制: 10s
章节: 一维数组
问题描述
为了培养明明对数学的热爱,明明的爸爸经常想出一些简单有趣且富有数学思想的游戏给明明玩。有一次,明明的爸爸在纸上写了N个数字,有正整数、负整数和0。明明的爸爸给明明一个范围,他可以选大于等于L1个且小于等于L2个的数字(L1≤L2),且这些数字必须是连续的。但是要求明明选出的数的和最大,这样说明明可能不太明白,于是明明爸爸就举了一个简单的例子。 例如有5个数字为“1”、“2”、“3”、“4”、“5”,明明可以选择大于等于1个且小于等于2个的数字,也就是说明明可以选择1个数字,或者连续的2个数字。通过观察数字串,最后我们会选2个数字,4和5,他们的和最大,为9。 明明明白爸爸的意思后,就开始玩起游戏来。但是他发现,这个游戏看似简单,其实还是有相当的难度,因为数字越多,选择数字个数范围越大,则题目越难,到后面明明有些不想玩了。于是明明就求助于你,请你帮他写一个程序,来求出和的最大值。 明明的问题可以归结为:有N个数字,从中选择出连续的M(L1≤M≤L2)个数,求出它们之和的最大值。
输入说明
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据有两行,每组测试数据的第一行有三个整数N(0<N≤20)、L1、L2(0<L1≤L2≤N),N表示数字串中有多少个整数,L1、L2表示可选数字个数的范围,每组测试数据的第二行有N个整数,整数大小的绝对值都小于等于100,整数之间用一个空格隔开。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
代码如下:
#include <stdio.h>
// 定义一个极小值,用于初始化最大值
#define MIN_NUM -10000
int main() {
int N, L1, L2;
// 循环读取多组输入,直到输入结束
while (scanf("%d %d %d", &N, &L1, &L2) != EOF) {
int arr[25]; // 存储数字,N最大20,数组开25足够
// 读取N个数字
for (int i = 0; i < N; i++) {
scanf("%d", &arr[i]);
}
int max_sum = MIN_NUM; // 初始化最大和为极小值
// 枚举连续数字的长度:L1 ~ L2
for (int len = L1; len <= L2; len++) {
// 枚举起始下标,保证不越界
for (int start = 0; start <= N - len; start++) {
int sum = 0;
// 计算当前连续子数组的和
for (int i = start; i < start + len; i++) {
sum += arr[i];
}
// 更新最大值
if (sum > max_sum) {
max_sum = sum;
}
}
}
// 输出每组数据的结果
printf("%d\n", max_sum);
}
return 0;
}
数列1
作者: frankhuhu
时间限制: 10s
章节: 一维数组
问题描述
思维的严密性是相当重要的,尤其是在程序设计中,一个小小的错误,就可能导致无法想象的后果。明明的爸爸是一名富有经验的程序设计专家,深知思维严密的重要性。于是在明明很小的时候,就通过游戏的方式训练明明的思维严密性。今天,明明的爸爸和明明做了一个数列的游戏。
这个游戏很简单,就是有一数列,现在需要在数列中选出一个或者连续若干个数,要求这些数的和能被11整除。明明的爸爸想锻炼明明思维的严密性,因此要求明明尽可能多的找出符合条件的数列来,最好一个也不要漏掉。 例如有一数列为“11 22 33”,其中11可以被11整除,22可以被11整除,33可以被11整除,11+22=33能被11整除,22+33=55能被11整除,11+22+33=66能被11整除。所以以上一数列能被11整除的情况一共有六种。(注:虽然11+33也能被11整除,但是11和33在数列中没有连续出现,因此不算一种合理的情况。) 明明对这个游戏很感兴趣,高兴地玩了起来。由于粗心,明明总是无法一次就把所有的情况都找出来,这使得他爸爸不是很满意。于是明明爸爸决定先降低游戏的难度,事先告诉明明某一数列总共有多少种符合条件的选择数的方法,然后再让明明去选。明明的爸爸请你帮一个忙,他不想自己找出所有的情况,因此请你写一个程序,用程序来找出一共有多少种符合选数的情况,并把结果告诉他。 明明爸爸的问题可以归结为:给你一个数列,从中选出1个或连续若干个数,要求这些数的和能被11整除,问这样的选数方法一共有多少种。
输入说明
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据有两行,每组测试数据的第一行有一个整数n(0<n≤50),表示数字串中有多少个整数,每组测试数据的第二行有n个整数,整数大于等于0且小于等于100,整数之间用一个空格隔开。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将每组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个整数,即表示一共有多少种选数方法。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。 注:通常,显示屏为标准输出设备。
代码如下:
#include <stdio.h>
int main() {
int n;
// 循环读取多组测试数据
while (scanf("%d", &n) != EOF) {
int arr[55]; // n最大50,数组开55足够
// 读取数列
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
int count = 0; // 记录符合条件的数量
// 枚举所有连续子数组
// 起始位置 i
for (int i = 0; i < n; i++) {
int sum = 0; // 从i开始累加的和
// 结束位置 j(必须连续)
for (int j = i; j < n; j++) {
sum += arr[j]; // 累加当前数字
if (sum % 11 == 0) { // 判断是否能被11整除
count++;
}
}
}
// 输出结果
printf("%d\n", count);
}
return 0;
}
修理牛棚
作者: xxx
时间限制: 1s
章节: 一维数组
问题描述
在一个暴风雨的夜晚,农民约翰的牛棚的屋顶、门被吹飞了。 好在许多牛正在度假,所以牛棚(牛棚的总数S:1<= S<=200)没有住满。 剩下的牛一个紧挨着另一个被排成一行安置在有屋顶的牛棚来过夜。 所以有些牛棚里有牛,有些没有。
所有的牛棚有相同的宽度,且宽度设为1。 因为有些门遗失,农民约翰需要架起新的木板作为门。 他的新木材供应者将会供应他任何他想要的长度,但是供应者只能提供有限数目的木板。 农民约翰想将他购买的木板总长度减到最少。
计算拦住所有有牛的牛棚所需木板的最小总长度。
输出所需木板的最小总长度作为的答案。
说明:拦住一个牛棚需要的木板长度为1,拦住相邻的三个牛棚则需要木板长度为3。
比如有牛的牛棚编号为:
3 5 8 10 11
并且只能使用两块木板,
则第一块木板从3到5,长度为3,
第二块木板从8到11,长度为4,
因此,需要木板的总长度为7。
输入说明
第 1 行: M 和 C(用空格分开)
第 2 到 C+1行: 每行包含一个整数,表示牛所占的牛棚的编号。
其中:
可能买到的木板最大的数目:M(1<= M<=50);
需要安置的牛的数目C(1<= C <=S)
安置后牛所在的牛棚的编号stall_number(1<= stall_number <= S)。
输出说明
单独的一行包含一个整数表示所需木板的最小总长度
代码如下:
#include <stdio.h>
#include <stdlib.h>
// 排序函数:从小到大
int cmp(const void *a, const void *b) {
return *(int *)a - *(int *)b;
}
int main() {
int M, C;
// 输入木板数M,牛数C
scanf("%d %d", &M, &C);
int stall[205]; // 存储有牛的牛棚编号
for (int i = 0; i < C; i++) {
scanf("%d", &stall[i]);
}
// 1. 对牛棚编号排序
qsort(stall, C, sizeof(int), cmp);
// 2. 计算所有相邻牛棚的间隔
int gap[205], k = 0;
for (int i = 1; i < C; i++) {
gap[k++] = stall[i] - stall[i-1] - 1;
}
// 3. 间隔从大到小排序(优先跳过最大空隙)
qsort(gap, k, sizeof(int), cmp);
// 4. 计算总长度:最右 - 最左 + 1
int total = stall[C-1] - stall[0] + 1;
// 5. 减去 M-1 个最大间隔
for (int i = k-1; i >= 0 && M > 1; i--, M--) {
total -= gap[i];
}
// 输出答案
printf("%d\n", total);
return 0;
}
英语翻译:
卷积神经网络(CNN)是深度学习中最重要的模型之一,广泛应用于图像分类、目标检测、图像分割等计算机视觉任务。与传统的全连接神经网络相比,CNN通过局部连接和权值共享大幅减少了参数数量,降低了计算复杂度。
卷积层能够从原始图像中自动提取特征,包括边缘、纹理和形状等。随着网络层数的增加,模型可以学习到更抽象、更复杂的特征表示。此外,池化层通常用于降低特征图的空间维度,从而减少计算量并提升模型的鲁棒性。
在实际应用中,CNN在医学影像分析、自动驾驶、人脸识别等领域取得了显著成功。然而,训练深度卷积神经网络往往需要大量标注数据和强大的计算资源,这仍是当前研究中的一个重要挑战。
