蒟蒻解法——纯暴力 O(n²)

P2669 [NOIP2015 普及组] 金币

_LiM @ 2017-10-02 10:57:21

我不是dalao,所以就写了一个很简单的解法

#include<iostream>
#include<cmath>
using namespace std;
int i,n,sum,j,ans; 
int main()
{
    cin>>n;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=i;j++)     //用一个双循环 模拟
        {
            sum+=i;
            ans++;
            if(ans==n)
            {
                cout<<sum;
                return 0;//这里如果发现已到次数,直接return 0,不用break
            }
        }
    }    
}
dalao们说还有哪些地方可以简写?

by _LiM @ 2017-10-02 10:58:15

一遍AC


by iphone_X @ 2017-10-03 15:06:05

有,你的双循环的时间复杂度较长,这题就是几个数的平方累加,你再在最后判一下有没有超过N,代码如下(也是一遍过):

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
int a,b,n,m,i=0;
int main()
{
    cin>>n;
    while(n>0){
        i++;
        if(n>i){    //判断有无超N
            m+=i*i;
            n-=i;
        }
        else{
            m+=i*n;
            n-=n;
        }
    }
    cout<<m;
    return 0;
}
这样耗时就可以缩短

by iphone_X @ 2017-10-03 15:06:39

@李鸣宇


by _LiM @ 2017-10-03 15:39:37

谢谢 [/fly]O(∩_∩)O谢谢[/fly]


by MscWood @ 2017-10-18 20:45:21

@_hutao_

代码优化:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
    long long ans=0,k,i=1;
    cin>>k;
    while(k>=i)
    {
        k-=i;
        ans+=i*i;
        i++;
    }
    ans+=k*i;
    cout<<ans;
    return 0;
}

by pascalfans @ 2018-06-24 15:02:54

@hutao

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
 inc i,n,x,y,s;
 cin>>n;
 y=1;
 x=1;
 s=0;
 for(i=1;i<=n;i++)
  {
   s+=y;
   x--;
   if (x=0){
            x=y+1;
            y+=1;
           }
  }
 cout<<s;
 return 0;
 }

by hutao @ 2018-07-16 17:17:24

@pascalfans 怎么了


by pascalfans @ 2018-07-19 15:30:27

@错了

(诶呀)


|