一、P8780 [蓝桥杯 2022 省 B] 刷题统计 - 洛谷
算法代码:
#include<bits/stdc++.h> // 包含标准库中的所有头文件,方便使用各种数据结构和算法
using namespace std; // 使用标准命名空间,避免每次调用标准库函数时都要加 std::int main() {long long a, b, n; // 定义长整型变量 a, b, n,分别表示工作日每天的题目数量、周末每天的题目数量和目标题目数量cin >> a >> b >> n; // 从标准输入读取 a, b, n 的值long long week = 5 * a + 2 * b; // 计算一周内(5个工作日和2个周末)小明总共能完成的题目数量long long fullWeeks = n / week; // 计算完成目标题目数量 n 需要多少个完整的周long long remaining = n % week; // 计算完成完整周数后,剩余的题目数量long long days = fullWeeks * 7; // 计算完整周数对应的天数(一周7天)if (remaining > 0) { // 如果剩余的题目数量大于0,则需要额外计算完成这些题目所需的天数for (int i = 1; i <= 7; ++i) { // 遍历一周的7天(周一到周日)if (i <= 5) { // 如果是周一到周五(前5天)remaining -= a; // 减去工作日每天完成的题目数量 a} else { // 如果是周六或周日(后2天)remaining -= b; // 减去周末每天完成的题目数量 b}days++; // 每过一天,总天数加1if (remaining <= 0) { // 如果剩余的题目数量小于等于0,说明题目已经完成break; // 跳出循环}}}cout << days << endl; // 输出总天数return 0; // 程序正常结束
}
代码逻辑总结:
-
输入处理:读取小明每天完成的题目数量 a 和 b,以及目标题目数量 n。
-
周计算:计算一周内小明能完成的题目总数,并计算需要多少个完整的周才能完成 n题。
-
剩余题目处理:计算完成完整周数后剩余的题目数量,并逐天计算完成这些剩余题目所需的天数。
-
输出结果:输出完成 n 题所需的总天数。
二、P8795 [蓝桥杯 2022 国 A] 选素数 - 洛谷
题解:(还是看大佬的思路代码吧,我的水平接触不到国赛,但还是可以学习一下的)
#include<bits/stdc++.h> // 包含标准库中的所有头文件,方便使用各种数据结构和算法
#define ri register int // 定义宏 ri,表示寄存器变量 int,用于优化性能
#define maxn 1000005 // 定义宏 maxn,表示数组的最大大小为 1000005
#define inf 0xffffff // 定义宏 inf,表示一个较大的值(0xffffff)
using namespace std; // 使用标准命名空间,避免每次调用标准库函数时都要加 std::// 快速读入函数,用于从标准输入读取一个整数
inline int read(){int x=0,f=1; // x 用于存储结果,f 用于存储符号(正负)char ch=getchar(); // 读取一个字符while(ch<'0'||ch>'9'){ // 如果字符不是数字if(ch=='-') // 如果是负号f=-1; // 设置 f 为 -1ch=getchar(); // 继续读取下一个字符}while(ch>='0'&&ch<='9'){ // 如果字符是数字x=x*10+ch-48; // 将字符转换为数字并累加到 xch=getchar(); // 继续读取下一个字符}return x*f; // 返回结果(考虑符号)
}// 快速输出函数,用于将一个整数输出到标准输出
inline void write(int n){if(n<0){ // 如果 n 是负数putchar('-'); // 输出负号n=-n; // 取绝对值}if(n>9) // 如果 n 是多位数write(n/10); // 递归输出高位putchar(n%10+'0'); // 输出最低位
}int n; // 定义全局变量 n,表示输入的上限
int np[maxn]; // 定义数组 np,用于存储每个数的最小质因数
vector<int>pri; // 定义向量 pri,用于存储质数// 初始化函数,用于生成质数并计算每个数的最小质因数
void init(){for(ri i=2;i<=n;i++){ // 遍历从 2 到 n 的所有数if(!np[i]){ // 如果 i 是质数pri.push_back(i); // 将 i 加入质数向量np[i]=i; // 设置 i 的最小质因数为 i}for(auto j:pri){ // 遍历所有质数if(i*j>n)break; // 如果 i*j 超过 n,跳出循环np[i*j]=max(max(np[i*j],j),np[i]); // 更新 i*j 的最小质因数if(!(i%j))break; // 如果 j 是 i 的质因数,跳出循环}}
}// zy 数组,用于存储某个计算结果
int zy[maxn];// 主函数
signed main(){n=read(); // 读取输入的 ninit(); // 调用初始化函数for(ri i=2;i<=n;i++){ // 遍历从 2 到 n 的所有数if(np[i]^i) // 如果 i 不是质数zy[i]=i-np[i]+1; // 计算 zy[i] 的值else zy[i]=i; // 如果 i 是质数,zy[i] 等于 i}int mini=inf; // 定义变量 mini,用于存储最小值,初始值为 infif(np[n]==n||!np[n]) // 如果 n 是质数或 np[n] 为 0write(-1); // 输出 -1else{for(ri i=n-np[n]+1;i<=n;i++) // 遍历从 n-np[n]+1 到 n 的所有数if(np[i]!=i)mini=min(mini,zy[i]); // 更新 miniwrite(mini); // 输出 mini}return 0; // 程序正常结束
}