回 帖 发 新 帖 刷新版面

主题:60次编程比赛

原60次的出题人要伸张出题权请联系我or斑猪
题大家肯定见过,数据范围肯定没见过。以上
结束时间[color=FF0000]8/25 20:00[/color]
[url=http://www.programfan.com/club/post-247561.html]答疑帖[/url]
重申,本帖禁水,要水请到[url=http://www.programfan.com/club/post-247561.html]答疑帖[/url]去
题:-----------------------------------------------------------
Problem
有n堆苹果,每次可以将两堆合并为一堆,这次操作消耗的体力是这两堆苹果数之和。最终需要将n堆苹果合并为一堆,问最少要多少体力?
这些苹果十分特殊:一开始的时候第i堆苹果有i个苹果,i=1,2,...,n

嘛,我会先在n<=5,000评测,再在n<=50,000评测,最终级别是n<=[color=FF0000]500,000,000[/color]。当然,[color=FF0000]时限不变[/color]。

Input
从控制台输入一个正整数n

Output
一行一个数,表示需要的最少体力,保证答案<2^63

Sample Input
2

Sample Output
3

Limits
时限:1s。内存限:64MB

评测参数:-----------------------------------------------------
评测cpu:Celeron 2.4G
C++选手禁用STL
禁止一切系统操作和文件读写
c/c++编译器默认采用g++。望选手能根据编译器修改自己的代码
追加:Windows下的g++是用mingw32,所以%lld标识符请换用%I64d以达到正确的答案。对于未修改的我会在评测前手动修改,不影响成绩
---------------------------------------------------------------
本次评测将采用半自动评测方式,如果遇到编译错误我尽量修改为可编译通过的代码(影响成绩)。具体评测规则将在成绩公布帖中公布

回复列表 (共16个回复)

沙发

路过`~

板凳

如果有是有序那就是贪心的nlogn啊。。。。够经典
不过你这个貌似有公式。。。

3 楼

汝们别这样……要水水到答疑帖去。斑猪麻烦连同本回复移动到答疑帖去
p.s.这题nlogn大数据显然TLE

4 楼

是啊,所以我才说貌似有公式,可我还没推出来,==
你把回复隐藏了好吧。。。。

5 楼

/*
没有mingw...编译如果有问题尽量帮改改……
*/
#include <stdio.h>

typedef long long llong;

llong f(llong n)
{
    int k = 3;
    llong c = 1, t = 0;
    if (n <= 0)
        return 0;
    for (;; k++, n -= c, c = c != 1 ? c + c : 3)
        if (n > c)
            t += (n + n - c + 1) * c / 2 * k;
        else
        {
            t += (n + 1) * n / 2 * k;
            break;
        }
    return t;
}

int main(void)
{
    llong n;
    scanf("%I64d", &n);
    printf("%I64d\n", (n - 1) * 3 + f(n - 2));
    return 0;
}

6 楼

main()
{double i,j;
int m,n;
double out; 
while(1)
{  printf("input\n");
   scanf("%d",&n);
   i=0;
   j=1;
   for(m=0;m<n;m++)
       { out=i+j;
         i++;
         j+=i;
             }
   printf("output\n%f\n",out);
     }
      }

7 楼

[code=c]
#include <stdio.h>


int main()
{
    int n, i, j, m, count; 
    int number;
    double num;
    printf("Please input number:\n");
    scanf("%d", &n);
    
    switch(n)
    {
    case 0:        
    case 1:
    case 2:
        num = n;
        break;
    case 3:
        num = 6.0;
        break;
    default:
        i = n%3;        
        switch(i)
        {
        case 0:
            j = n/3;
            num = 0;
            break;
        case 1:
            j = (n-1)/3;
            num = n;
            break;
        case 2:
            j = (n-2)/3;
            num = 2*n-1;
            break;
        default:
            printf(" Error!\n");
            break;
        }
        number = j+i;   
        m = 0;
        count = 0;
        while (number>1)
        {
            if (number%2 != 0)
            {
                count += 1<<m;
                number = (number-1)/2+1;                        
            }
            else
                number = number/2;
            m++;
        }
        num += ((3.0*(double(j)*(double(j)+1.0)))/2.0+j*j*3);    
        num *= m;
        if (count)
            num -= (3.0*(double(2*j)*(double(2*j)+1.0)-(double(2*j-count)*(double(2*j-count)+1.0))))/2.0; 
        num += (3.0*(double(j*2)*(double(j*2)+1.0)))/2.0;            
        break;
    }    
    printf("%.0f\n",num);     
    return 0;
}[/code]
我在vc6下写的

8 楼

<把代码删了,发现昨天把问题想得太简单了,先在贵宝地占个位置,如果想到再贴上来~~~~~>

9 楼

对吗?谢谢
[code=c]
#include "stdio.h"
#include "stdlib.h"
main()
{
    unsigned long i,n,s=0,a=0;
    char* show;

    scanf("%UL",&n);
    for(i=1;i<=n;i++)
    {
        a+=i;
        s+=a;
    }
    s--;
    ultoa(s,show,10);
    printf("%s\n",show);

}
[/code]

10 楼


看一下

我来回复

您尚未登录,请登录后再回复。点此登录或注册