C++14 (GCC 9)大佬求解

P2669 [NOIP2015 普及组] 金币

kkkLUOGI @ 2024-05-03 19:06:29

怎么写啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!(心态已崩)


by juruolaidayang_AKIOI @ 2024-05-03 19:11:56

这是我的,你拿去看吧

#include<iostream>
using namespace std;
int main(){
    int n,a=1,c=0,b=0;
    cin>>n;
    for(int i=1;i<=n;i++){
        c+=a;
        b++;
        if(b==a){
            b=0;
            a++;
        }
    }
    cout<<c;
    return 0;
}

by wandou_pea @ 2024-05-22 22:17:45

其实看题解就好了,但我也稍微和你讲一下:

用两个变量来做,a是目前这个范围内过了多少天,b是这个范围的边界。怎么说可能有点难理解,我们来模拟一下:

第一天,骑士获得1枚金币
第二天,骑士获得2枚金币
第三天,骑士获得2枚金币
第四天,骑士获得3枚金币
第五天,骑士获得3枚金币
第六天,骑士获得3枚金币

也就是说,在第一个区间(第一天)里,金币获得数量是1,在第二个区间(第二天到第三天)里,金币获得数量是2,在第三个区间(第四天到第六天)里,金币获得数量是3。

也就是说第一个区间内,b(也就是区间长度)为1(只有第一天)。第二个区间内,b(也就是区间长度)为2(有第二天和第三天)。

只要骑士每次获得金币,当前区间的获得金币天数就会+1(也就是a+=1)。当他获得金币次数已经达到边界天数上限时,天数上限就会变成b+1,然后当前区间天数(也就是a)变为0

有趣的是,骑士每天获得的金币数,就是b(也就是区间长度)

自己写一下属于自己的代码会让你遇到此类题目时有更好的思路,祝你早日成为cpp大犇!

如有错误,欢迎改正qwq


by kkkLUOGI @ 2024-07-15 12:41:40

@laixiaoyang 谢谢


by kkkLUOGI @ 2024-07-15 12:42:55

@wandou_pea Thanks谢谢


by lrq666_ @ 2024-07-29 15:05:20

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a;
    cin>>a;
    int sum=0;
    int c=1;
    for(int i=1;i<=a;i++){
    a=a-i;
    sum+=c*c;
    c++;    
    }
    cout<<sum+a*c;
    return 0;
}

参考我的


by Andy_hpy @ 2024-08-09 11:05:58

递归方案

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100005];
ll f1(ll n,ll s){
    if(n<s)return n*s;
    if(a[n]!=0)return a[n];
    a[n]=s*s+f1(n-s,s+1);
    return a[n];
}
ll f(ll n){return f1(n,1);}
int main(){
    ll n;
    cin>>n;
    cout<<f(n);
    return 0;
}

by lizongrui123 @ 2024-08-18 13:40:25

include<iostream>

using namespace std; int main(){ int a,b=0,c=1,i; cin>>a; for(i=1;i<=a;i++){ a-=i; b+=c*c; c++; }

cout<<b+a*c;

}

c++

by wandou_pea @ 2024-08-19 11:19:59

@kkkLUOGI 不用谢


by kkkLUOGI @ 2024-08-27 11:59:15

谢谢各位


|