其他分享
首页 > 其他分享> > 洛谷 | CF1327A Sum of Odd Integers

洛谷 | 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