洛谷 | 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、【关于该题思路】
注意思考方式和最后的判断条件;
标签:CF1327A,输出,nnum,int,Sum,long,--,while,Odd 来源: https://www.cnblogs.com/bxhbxh/p/14983942.html