当前位置: 首页 > article >正文

第四次CCF-CSP认证(含C++源码)

第四次CCF-CSP认证

  • 第一道(easy)
    • 思路及AC代码
  • 第二道(easy)
    • 思路及AC代码
      • 遇到的问题
  • 第三道(mid)
    • 思路及AC代码

第一道(easy)

在这里插入图片描述
题目链接

思路及AC代码

这题就是将这个矩阵旋转之后输出,观察样例,我们可以将这个旋转表示出来,就是从左到右从上到下输出s[j][i],文字版思路:
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;
const int N=1010;
int s[N][N];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cin>>s[i][j];
        }
    }
    for(int i=m-1;i>=0;i--)
    {
        for(int j=0;j<n;j++)
        {
            cout<<s[j][i]<<" ";
        }
        cout<<endl;
    }
}

第二道(easy)

在这里插入图片描述
题目链接

思路及AC代码

#include <bits/stdc++.h>
using namespace std;

// 自定义比较函数,用于按出现次数从高到低排序
bool compare(const pair<int, int>& a, const pair<int, int>& b) {
    if (a.second != b.second) {
        return a.second > b.second;
    }
    // 如果出现次数相同,按数字本身从小到大排序
    return a.first < b.first;
}

int main() {
    int n;
    cin >> n;
    vector<int> s(n);
    // 用于记录每个数字的出现次数
    unordered_map<int, int> showup;

    // 读取输入的数字
    for (int i = 0; i < n; i++) {
        cin >> s[i];
        // 统计每个数字的出现次数
        showup[s[i]]++;
    }

    // 将 unordered_map 中的元素存储到 vector 中
    vector<pair<int, int>> freq(showup.begin(), showup.end());

    // 按出现次数从高到低排序
    sort(freq.begin(), freq.end(), compare);

    // 输出排序后的结果
    for (const auto& c : freq) {
        cout << c.first << " " << c.second << endl;
    }

    return 0;
}

遇到的问题

一开始看错题目了 题目是要按出现频率从高到低,我看成按数字本身从大到小输出了,还有一个问题就是当你开了一个大小为1010的静态数组之后,就会发现除去输入的n个数字之后,数组里面默认都是0,当你使用哈希表统计数字和它出现次数之间的映射,输出的时候,就会出现0对应的次数是一个很大的数字所以优化成用vector容器来存储好一些
在这里插入图片描述

第三道(mid)

在这里插入图片描述
题目链接

思路及AC代码

思路讲解直接去看y总的视频就好(acwing),这是根据代码AI生成的文字版思路,其实最难的就是第三条,我们需要通过题目给的1850年1月1日是星期二来暴力枚举出目标日期是星期几,这个暴力枚举是这题的关键
在这里插入图片描述
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;

// 判断是否为闰年
bool isLeapYear(int year) {
    return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
}

// 获取每个月的天数
int daysInMonth(int year, int month) {
    int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if (month == 2 && isLeapYear(year)) {
        return 29;
    }
    return days[month - 1];
}

// 计算从 1850 年 1 月 1 日到指定日期的天数
int daysSince1850(int year, int month, int day) {
    int totalDays = 0;
    for (int y = 1850; y < year; ++y) {
        totalDays += isLeapYear(y) ? 366 : 365;
    }
    for (int m = 1; m < month; ++m) {
        totalDays += daysInMonth(year, m);
    }
    totalDays += day - 1;
    return totalDays;
}

// 获取指定年份 a 月第 b 个星期 c 的日期
void getDate(int a, int b, int c, int year) {
    int firstDayOfMonth = (daysSince1850(year, a, 1) + 2) % 7;  // 1850 年 1 月 1 日是星期二
    if (firstDayOfMonth == 0) firstDayOfMonth = 7;  // 让星期日对应 7

    int targetDay = 1 + (c - firstDayOfMonth + 7) % 7 + (b - 1) * 7;

    if (targetDay > daysInMonth(year, a)) {
        printf("none\n");
    } else {
        printf("%04d/%02d/%02d\n", year, a, targetDay);
    }
}

int main() {
    int a, b, c, y1, y2;
    scanf("%d %d %d %d %d", &a, &b, &c, &y1, &y2);

    for (int year = y1; year <= y2; ++year) {
        getDate(a, b, c, year);
    }

    return 0;
}

http://www.kler.cn/a/580819.html

相关文章:

  • 构建服务器--在线单词查询
  • Ubuntu 22.04 升级到 Ubuntu 24.04 全流程指南
  • tcc编译器教程6 进一步学习编译gmake源代码
  • Unity2017打包出来后的场景一片红
  • P8630 [蓝桥杯 2015 国 B] 密文搜索--map、substr
  • 大型语言模型为何看不懂电路图:局限性分析
  • OpenHarmony 5.0.0 Release
  • 【算法 C/C++】二维前缀和
  • 蓝桥杯备赛-差分-重新排序
  • 逻辑回归实战——银行贷款案例初步实现
  • MoonSharp 文档四
  • ESP32S3N16R8驱动ST7701S屏幕(vscode+PlatfoemIO)
  • C#程序结构及基本组成说明
  • 【MySQL_06】表的相关操作
  • 2025年渗透测试面试题总结-华顺某信安-安全服务工程师(题目+回答)
  • 1分钟看懂React的那些Hook‘s
  • Python:函数(一)
  • UIToolkit(一)
  • cursor mcp 在windows下配置
  • MySQL 索引技术指南