P2669 10分,数据6以下没有问题,6以上出错

P2669 [NOIP2015 普及组] 金币

anaoai @ 2021-08-30 17:51:14

在6以下数据都没有问题,6以上都比实际数据要小,找不到问题在哪,希望有大佬能解答,十分感谢!

#include <bits/stdc++.h>
using namespace std;
int main(){
    int k;
    int count=1;
    int total=0;
    int a=0;
    cin>>k;
    while(1){
        for(int i=count;i>=0;i--){
            total=total+count;
            //cout<<total<<endl;//debug
            //cout<<count<<endl;
            a++;
            if(a>k){
            break;
            }
        }
        if(a>k){
        break;
        }else{
    count++;
        }
    }
    cout<<total;
  return 0;
}

by backers @ 2021-08-30 18:11:44

i>0 而不是i>=0 这会让for多执行一次,导致数据缩水


by qiu_tianyu @ 2021-08-30 18:19:10

@anaoai 我帮你改了,然后那个a>k 改成 a>=k或a==k。 不然会多算一天

{你的代码(改后):}
#include <bits/stdc++.h>
using namespace std;
int main(){
    int k;
    int count=1;
    int total=0;
    int a=0;
    cin>>k;
    while(1){
        for(int i=count;i>0;i--)
        {
            total=total+count;
            a++;
            if(a>=k){
            break;
            }
        }
        if(a>=k){
            break;
        }else{
            count++;
        }
    }
    cout<<total;
    return 0;
}

by 少年自有狂 @ 2021-08-30 18:21:16

@繁星__终为空 对,而且题目中问的是第k天的金币数,两个if语句里的条件应该是a>=k而不是a>k,否则会算到第k+1天

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int k;
    int count = 1;
    int total = 0;
    int a = 0;
    cin >> k;
    while (1)
    {
        for (int i = count; i > 0; i--)
        {
            total = total + count;
            //cout<<total<<endl;//debug
            //cout<<count<<endl;
            a++;
            if (a >= k)
            {
                break;
            }
        }
        if (a >= k)
        {
            break;
        }
        else
        {
            count++;
        }
    }

    cout << total;
    return 0;
}

把这几个地方改掉,就行了\ 评测记录:https://www.luogu.com.cn/record/57250280


by 少年自有狂 @ 2021-08-30 18:23:32

我推的公式解,你看看

#include<bits/stdc++.h>
using namespace std;
long long n, k,ans;
int main(){
    cin >> k;
    for (int i = 1; i <= k;i++)
        ans+=ceil(sqrt(2 * i + 0.25) - 0.5);
    cout << ans;
    return 0;
}

by anaoai @ 2021-08-30 18:48:36

@曹越 感谢,我该看看数据规律的,公式下来好简单2333


by anaoai @ 2021-08-30 18:50:33

@qiu_tianyu @繁星__终为空 感谢大佬,一开始我惯性思维,以为k就该循环k次2333


by backers @ 2021-08-30 19:23:16

其实我自己是有漏给1个点的,去吃了口饭,刚回来第一次被人当大佬,挺不习惯的


by backers @ 2021-08-30 19:25:01

公式这样更简单

for (int i = 1; i <= k;i++)

   ans+=i*i;

by 一洛本谷通 @ 2021-10-06 14:38:50

@anaoai

#include <bits/stdc++.h>
using namespace std;
int main(){
    int k;
    int count=1;
    int total=0;
    int a=0;
    bool b=0;
    cin>>k;
    while(1){
        for(int i=count;i>0;i--){
            a++;
            total=total+count;
            //cout<<total<<endl;//debug
            //cout<<count<<endl;
        }
        if(a>=k){
            total+=(k-a)*count;
            break;
        }else count++;
    }
    cout<<total;
    return 0;
}

修改后代码


|