洛谷 | CF1327A Sum of Odd Integers
【题目描述】
给定 n, k,求是否能用 k 不同奇数的和来表示 n;
【输入格式】
第一行一个数 t (1 <= t <= 10^5);
之后 t 行每行两个数 n, k(1 <= n, k <= 10^7);
【输出格式】
如果有解,输出"YES",否则输出"NO";
【解题思路】
从1、3、5开始的 k - 1的个奇数求和得 sum,用n - sum得大于(2 * k - 3)的奇数(因为所用奇数不能重复)则输出“YES” , 否则输出“NO”;
【错误代码】
1 #include <iostream> 2 3 using namespace std; 4 5 int main() 6 { 7 int m; 8 cin >> m; 9 10 while(m --) 11 { 12 int n, k; 13 scanf("%d%d", &n, &k); //容易爆int,直接改long long 14 15 int x = 1, nnum = 0; 16 while(--k) //记得计算好循环次数,可以输出一下看有几次循环:while(-- k)(k - 1)次; while(k --) k 次; 17 { //C++ 1s 算 1e8数量级次,有可能是2e8或3e8,此处写for循环可能超时,改用求和公式(数学推理) 18 nnum += x; 19 x += 2; 20 } 21 if(n - nnum > 0 && (n - nnum) % 2 == 1) puts("YES"); //最后判断条件不是奇数,而是大于2 * k - 3 的奇数,思考不周全 22 else puts("NO"); 23 } 24 25 return 0; 26 }
【正确代码】
1 #include <iostream> 2 3 using namespace std; 4 5 typedef long long ll; //改进点【1】 6 7 int main() 8 { 9 int m; 10 cin >> m; 11 12 while(m --) 13 { 14 ll n, k; 15 scanf("%lld%lld", &n, &k); //改进点【2】 16 17 ll x = 2 * k - 1, nnum = (k - 1) * (k - 1); //改进点【3】 18 if(n - nnum >= x && (n - nnum) % 2 == 1) puts("YES"); //改进点【4】 19 else puts("NO"); 20 } 21 22 return 0; 23 }
【知识学习】
1、【关于int 与 long long】
(1)int 范围 2e9, 感觉要爆及时改 long long;
(2)long long 读入是 %lld,输出是 %lld; double 读入用 %lf, 输出用 %lf, %f 均可;
2、【关于TLE】
C++ 1s 计算次数一般为1e8, 如果目测会tle(一般看时间复杂度),则直接考虑换方法;【积累常见的改进策略】
3、【关于while循环次数】
while (k --) 循环 k 次; while(-- k)循环 k - 1次;及时输出测评;
4、【关于该题思路】
注意思考方式和最后的判断条件;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架