)
明天就是星期天了 这个作品应该也是明天发布 明天终于可以有点空余时间了实验室放假今天上午的考试还是这么难 总共九道题 以我现在的实力只能写出一到两个 效率还是太低了 但我不会放弃 依旧“坚持” 我会继续在这里写下我的故事 不论今后的成与败 只想让这个故事在精彩一点今天就开始一一攻克这几道题 有一道题前几天写过了 那就开始记录吧让故事变得精彩若是有什么值得改进的地方 或好的建议 可以在底下评论 依旧还是C语言 感觉C语言写这些算法还是太吃力了 得赶快自学完数据结构 就去学 c 还要边学算法我现在记录的题一般都是洛谷上的算法题1.题目先讲一下我的思路 就是用埃氏筛素数法 只要知道这个方法就不会爆表 也可惜我不会用线性筛 而且这题自己第一次做也没做对解题代码#include stdio.h #include stdlib.h int main() { int n; scanf(%d, n); // 改为char数组每个元素占1字节 char *a (char*)malloc((n 1) * sizeof(char)); // 正确初始化每个元素为1 for (int i 0; i n; i) { a[i] 1; } a[0] a[1] 0; // 0和1不是素数 // 埃氏筛法逻辑不变 for (int i 2; i * i n; i) { if (a[i]) { for (int j i * i; j n; j i) { a[j] 0; } } } // 统计素数个数 int sum 0; for (int i 2; i n; i) { sum a[i]; } printf(%d, sum); free(a); // 释放内存 return 0; }这是豆包写的 感觉巨牛 我本来使用整形来定义一个数组的 然后发现过不了后两个测试点 超内存了 如果该方法我也不会了 于是豆包给我改成 char 了 我在想这有啥区别 突然看到他说 char 只有 1 个字节 我直接悟了 我是真没想到可以往这方面更改 直接把一些死的只是串通起来了运用起来了 又学到一个小知识2.题目花一下午时间去搞这道题 真是折磨 又让我学了一个排序方式 自己又默写了 n 遍 又错了 n 遍 已经不记得这是第几个排序方法了 看到这道题使用的是归并 于是又去学 比快排还要难理解 终于还是写出来了 不想在说啥了 哎解题代码#include stdio.h #include stdlib.h long long count 0; // 使用long long类型避免整数溢出 void merge(int a[], int left, int mid, int right) { int n right - left 1; int *temp (int *)malloc(n * sizeof(int)); int l_pos left; int r_pos mid 1; int pos 0; // 临时数组的索引从0开始 // 合并两个子数组并统计逆序对 while (l_pos mid r_pos right) { if (a[l_pos] a[r_pos]) { temp[pos] a[l_pos]; } else { // 关键当a[l_pos] a[r_pos]时左半部分从l_pos到mid的所有元素都与a[r_pos]构成逆序对 count mid - l_pos 1; temp[pos] a[r_pos]; } } // 复制剩余元素 while (l_pos mid) temp[pos] a[l_pos]; while (r_pos right) temp[pos] a[r_pos]; // 将临时数组复制回原数组 for (int i 0; i n; i) { a[left i] temp[i]; } free(temp); // 释放临时数组 } void mergeSort(int a[], int left, int right) { if (left right) { int mid left (right - left) / 2; // 防止整数溢出 // 递归排序左右两部分 mergeSort(a, left, mid); mergeSort(a, mid 1, right); // 合并并统计逆序对 merge(a, left, mid, right); } } int main() { int n; scanf(%d, n); int *a (int *)malloc(n * sizeof(int)); for (int i 0; i n; i) { scanf(%d, a[i]); } mergeSort(a, 0, n - 1); printf(%lld\n, count); // 使用%lld格式输出long long类型 free(a); // 释放数组内存 return 0; }学完这归并后 想着怎么写这题 我也想不出怎么写 都是排序为啥归并可以 后面问了 ai 又是恍然大悟啊 哈哈哈哈哈哈哈 这题还是太难了 对于现阶段的我来说 纯属一般都是靠背的 有没有大佬提供一些更好的思路3.题目就算我知道求公约数和公倍数我也不知道写这道题 我的天赋啊 在哪里啊解题代码#include stdio.h #include math.h // 计算两个数的最大公约数GCD // 使用欧几里得算法辗转相除法 int gcd(int a, int b) { while (b ! 0) { int temp b; // 保存当前的b值 b a % b; // 计算a除以b的余数更新b为余数 a temp; // 更新a为原来的b值 } return a; // 当b为0时a即为GCD } int main() { int x, y; scanf(%d %d, x, y); // 检查y是否能被x整除 // 若不能则不存在满足条件的数对直接输出0 if (y % x ! 0) { printf(0); return 0; } int k y / x; // 计算k y/x即a*b的目标值 int count 0; // 计数器记录满足条件的数对数量 // 枚举k的所有因数对(a, b)其中a b // 只需枚举到i*ik因为若i是因数则k/i也是因数 for (int i 1; i * i k; i) { if (k % i 0) { // 若i是k的因数 int a i; int b k / i; // 计算对应的另一个因数 // 检查a和b是否互质 // 若互质则(a, b)和(b, a)都是有效的解 if (gcd(a, b) 1) { if (a ! b) { // 若a和b不相等贡献两种排列 count 2; // (a, b)和(b, a) } else { // 若a和b相等k为完全平方数仅贡献一种排列 count 1; // 例如(a, a) } } } } printf(%d, count); // 输出满足条件的数对总数 return 0; }自己写着代码不下三遍 花了我一上午才搞懂 **的 我数学现在这么差了吗 真的是一步一步把他拆解喂给 ai 昨天晚上还去问了同学 今天早上又懵懵懂懂 概念好复杂 很久没搞过这样的纯计算题了4.题目休息了一下午 晚上本来想继续写洛谷的 结果学院书记给我们发了一个牛客网站上的比赛链接 第一题就是这个我就不会写了 当然了 肯定不是因为难 主要是一些C语言的一些基础知识和计算符没有记 但我觉得也挺有意义的 警醒每个要打比赛的人 需要在赛前记住这些死的知识 废话不多说上代码解题代码#include stdio.h #include math.h int main() { int score; scanf(%d, score); // 计算token消耗量公式为150 * ln(score) double token 150.0 * log((double)score); // 输出结果保留6位小数 printf(%.6f\n, token); return 0; }写完我就一直在想不是ln吗 直接搞个 log 就是答案吗 难不成加个 double 就成了 ln 后面一搜原来 C语言里面 log 就是 ln 那么这时就要问了 那 log3 log2底数 怎么表达呢 那就是写成 longn就行了 n 就是代表的底数5.题目沉默是今晚的主旋律 解题吧 隔了五分钟 先前还是没搞懂 这回终于尝到精华部分了我只能感慨埃氏已经是天才了 我线性是真的要无敌了解题代码#include stdio.h #include stdbool.h #include stdlib.h #define MAX_N 100000000 #define MAX_PRIMES 5761455 // 1e8内的素数个数约为5.7e6 bool is_prime[MAX_N 1]; int primes[MAX_PRIMES]; int prime_count 0; void sieve() { for (int i 0; i MAX_N; i) { is_prime[i] true; } is_prime[0] is_prime[1] false; for (int i 2; i MAX_N; i) { if (is_prime[i]) { primes[prime_count] i; } for (int j 0; j prime_count i * primes[j] MAX_N; j) { is_prime[i * primes[j]] false; if (i % primes[j] 0) { break; } } } } int main() { sieve(); int n, q; scanf(%d %d, n, q); for (int i 0; i q; i) { int k; scanf(%d, k); printf(%d\n, primes[k - 1]); // 数组下标从0开始 } return 0; }非常感谢这位博主——若亦_Roy 给我带来了非常多的灵感 下班我靠 真的 我最近深刻体会到脑子不够用的状态 我本来还想着分享一道素数类的题 但是 这个线性筛就已经让我想死了 以前的我觉得时时刻刻都在学新东西 可以体会到那种将一个知识点吸收到自己的脑袋里的感觉 但是现在却慢慢不行 不知道是不是题的难度的问题 跨度太大 就像小学生学高中知识 即使是零基础教学但也是非常非常吃力的 但我肯定 有些人可以很快的学懂运用 以前的我也许也是这样 但是现在不知道为什么 脑袋真的已经看不进中文了 但对于刚刚开始的我 坚持才是最重要的 我的导师也许也觉得我没有什么天赋 她总是说让我转专业 但是从最开始我选择了计算机这个专业 我就要迈出第一步 我还没有尝试 又怎么知道结果 所以我也会在这个很好的平台一直发布我的内容 现在到头去写第五题痛苦啊所有题解代码都是后期添加过注释的 放心我没有照搬 我想着可以供认真写上面题的人不仅看看解题代码 也可以穿插一些思路