ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

C语言算法赛——蓝桥杯(省赛试题)

2026/9/29 14:46:41 拓冰建站 浏览量
C语言算法赛——蓝桥杯(省赛试题)

一、十四届C/C++程序设计C组试题


十四届程序C组试题A#include <stdio.h>
int main() 
{long long sum = 0;int n = 20230408;int i = 0;// 累加从1到n的所有整数for (i = 1; i <= n; i++){sum += i;}// 输出结果printf("%lld\n", sum);return 0;
}


//十四届程序C组试题B
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<time.h>// 时间字符串解析为结构体 tm
void parseTime(char* timeString, struct tm* timeStruct) {sscanf(timeString, "%d-%d-%d %d:%d:%d",&timeStruct->tm_year, &timeStruct->tm_mon, &timeStruct->tm_mday,&timeStruct->tm_hour, &timeStruct->tm_min, &timeStruct->tm_sec);// tm_year表示的是自1900年以来的年数,需要减去1900timeStruct->tm_year -= 1900;// tm_mon表示的是0-11的月份,需要减去1timeStruct->tm_mon -= 1;
}// 每一对相邻的上下班打卡之间的时间差
int calculateTimeDifference(char* time1, char* time2) {struct tm start, end;// 解析时间字符串为结构体 tmparseTime(time1, &start);parseTime(time2, &end);// 使用 mktime 将 tm 结构体转换为时间戳time_t startTime = mktime(&start);time_t endTime = mktime(&end);// 计算时间差return difftime(endTime, startTime);
}int main() {// 打卡记录数组char* punchRecords[] = {"2022-01-01 07:58:02","2022-01-01 12:00:05","2022-01-01 16:01:35","2022-01-02 00:20:05"};int numRecords = sizeof(punchRecords) / sizeof(punchRecords[0]);// 按照时间顺序对打卡记录进行排序for (int i = 0; i < numRecords - 1; i++) {for (int j = 0; j < numRecords - i - 1; j++) {if (strcmp(punchRecords[j], punchRecords[j + 1]) > 0) {// 交换记录char* temp = punchRecords[j];punchRecords[j] = punchRecords[j + 1];punchRecords[j + 1] = temp;}}}// 计算总工作时长int totalWorkDuration = 0;for (int i = 0; i < numRecords - 1; i += 2) {totalWorkDuration += calculateTimeDifference(punchRecords[i], punchRecords[i + 1]);}// 输出总工作时长printf("小蓝在2022年度的总工作时长是%d秒。\n", totalWorkDuration);return 0;
}


十四届程序C组试题C#include <stdio.h>
int main() {int n; // 事件数量scanf("%d", &n);int A[n], B[n], C[n]; // 存储每个事件中的A、B、C值int maxEvents = -1; // 最多发生的事件数量int X = 0, Y = 0, Z = 0; // 初始士兵数量for (int i = 0; i < n; ++i) {scanf("%d %d %d", &A[i], &B[i], &C[i]);// 计算每个国家的士兵数量X += A[i];Y += B[i];Z += C[i];// 判断是否有国家获胜if ((X > Y + Z) || (Y > X + Z) || (Z > X + Y)) {// 更新最多发生的事件数量maxEvents = i + 1;}}printf("%d\n", maxEvents);return 0;
}

#include <stdio.h>
int maximize_substrings(char* s)
{int count = 0;int i, n;// 遍历字符串,从第二个字符开始for (i = 1; s[i] != '\0'; ++i){// 如果当前位置是'?',则尽量使其与前一个字符不同if (s[i] == '?') {s[i] = (s[i - 1] == '1') ? '0' : '1';}// 计算互不重叠的00和11子串的个数if (s[i] == s[i - 1]){count += 1;}}return count;
}int main()
{char input_str[] = "1?0?1";int result = maximize_substrings(input_str);printf("互不重叠的00和11子串个数:%d\n", result);return 0;
}

 

#include <stdio.h>
#include <string.h>// 函数:计算最小翻转次数
int min_flips_to_match(char S[], char T[]) 
{int n = strlen(S);int flips = 0;// 从第二个位置到倒数第二个位置进行遍历for (int i = 1; i < n - 1; ++i) {// 如果当前位置的字符与目标串不同if (S[i] != T[i]) {// 进行翻转操作flips++;S[i] = T[i];S[i + 1] = (S[i + 1] == '0') ? '1' : '0';S[i + 2] = (S[i + 2] == '0') ? '1' : '0';}}return flips;
}int main() 
{// 示例输入char S[] = "01010";char T[] = "00000";// 计算最小翻转次数int result = min_flips_to_match(S, T);// 输出结果printf("Minimum flips required: %d\n", result);return 0;
}


#include <stdio.h>
#include <stdlib.h>#define MOD 998244353// 函数:计算矩阵子矩阵价值的和
int matrixSubmatrixSum(int n, int m, int matrix[n][m]) 
{// 预处理,计算每个位置的最大值和最小值int maxVal[n][m];int minVal[n][m];for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {if (i > 0) {maxVal[i][j] = (maxVal[i][j] > maxVal[i - 1][j]) ? maxVal[i][j] : maxVal[i - 1][j];minVal[i][j] = (minVal[i][j] < minVal[i - 1][j]) ? minVal[i][j] : minVal[i - 1][j];}if (j > 0) {maxVal[i][j] = (maxVal[i][j] > maxVal[i][j - 1]) ? maxVal[i][j] : maxVal[i][j - 1];minVal[i][j] = (minVal[i][j] < minVal[i][j - 1]) ? minVal[i][j] : minVal[i][j - 1];}maxVal[i][j] = (maxVal[i][j] > matrix[i][j]) ? maxVal[i][j] : matrix[i][j];minVal[i][j] = (minVal[i][j] < matrix[i][j]) ? minVal[i][j] : matrix[i][j];}}// 计算答案int result = 0;for (int a = 1; a <= n; ++a) {for (int b = 1; b <= m; ++b) {for (int i = 0; i + a - 1 < n; ++i) {for (int j = 0; j + b - 1 < m; ++j){int maxInSubmatrix = maxVal[i + a - 1][j + b - 1];int minInSubmatrix = minVal[i + a - 1][j + b - 1];result = (result + ((long long)maxInSubmatrix * minInSubmatrix) % MOD) % MOD;}}}}return result;
}int main() 
{// 示例输入int n = 3, m = 3;int matrix[3][3] ={{1, 2, 3},{4, 5, 6},{7, 8, 9}};// 计算答案int result = matrixSubmatrixSum(n, m, matrix);// 输出结果printf("Sum of submatrix values: %d\n", result);return 0;
}