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

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

cpp 复制代码
十四届程序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;
}
cpp 复制代码
//十四届程序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年以来的年数,需要减去1900
    timeStruct->tm_year -= 1900;
    // tm_mon表示的是0-11的月份,需要减去1
    timeStruct->tm_mon -= 1;
}

// 每一对相邻的上下班打卡之间的时间差
int calculateTimeDifference(char* time1, char* time2) {
    struct tm start, end;

    // 解析时间字符串为结构体 tm
    parseTime(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;
}
cpp 复制代码
十四届程序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;
}
cpp 复制代码
#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;
}
cpp 复制代码
#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;
}
cpp 复制代码
#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;
}
相关推荐
今天AI了吗23 分钟前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·数据库·人工智能·python·sql·深度学习·机器学习
TELL5211 小时前
selenium webdriver 第二次初始化的异常
开发语言·python
动词ing1 小时前
【C语言】自定义函数+指针入门
c语言·开发语言·算法
重生之后端学习2 小时前
283. 移动零[简单]✅
开发语言·数据结构·算法·leetcode·职场和发展
动词ing2 小时前
【C语言】结构体+文件基础
c语言·开发语言·数据结构
caimouse3 小时前
ReactOS 窗口系统分析(7):分层窗口与绘制辅助 — layered.c + draw.c
c语言·开发语言
丰锋ff3 小时前
基于 Qt 的智慧社区物业管理系统
开发语言·qt
夜不会漫长3 小时前
C++入门(1)
开发语言·c++·算法
大鹏说大话4 小时前
从爬虫到决策引擎:大数据下自媒体如何用Python挖掘用户痛点
开发语言·爬虫·python
Niuguangshuo4 小时前
silero-vad:超轻量级开源 VAD 实践指南
开发语言·python