一、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; // 程序正常結束
}