主题:60次编程比赛
FancyMouse [专家分:13680] 发布于 2007-08-22 12:03:00
原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以达到正确的答案。对于未修改的我会在评测前手动修改,不影响成绩
---------------------------------------------------------------
本次评测将采用半自动评测方式,如果遇到编译错误我尽量修改为可编译通过的代码(影响成绩)。具体评测规则将在成绩公布帖中公布
最后更新于:2007-08-25 13:49:00
回复列表 (共16个回复)
沙发
zhangmou [专家分:14200] 发布于 2007-08-22 12:19:00
路过`~
板凳
雨中飞燕 [专家分:18980] 发布于 2007-08-22 12:22:00
如果有是有序那就是贪心的nlogn啊。。。。够经典
不过你这个貌似有公式。。。
3 楼
FancyMouse [专家分:13680] 发布于 2007-08-22 12:25:00
汝们别这样……要水水到答疑帖去。斑猪麻烦连同本回复移动到答疑帖去
p.s.这题nlogn大数据显然TLE
4 楼
雨中飞燕 [专家分:18980] 发布于 2007-08-22 12:51:00
是啊,所以我才说貌似有公式,可我还没推出来,==
你把回复隐藏了好吧。。。。
5 楼
crossbow [专家分:150] 发布于 2007-08-22 14:08:00
/*
没有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 楼
plant [专家分:60] 发布于 2007-08-22 16:38:00
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 楼
ddszolo [专家分:50] 发布于 2007-08-22 18:16:00
[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 楼
merry05 [专家分:8920] 发布于 2007-08-22 18:42:00
<把代码删了,发现昨天把问题想得太简单了,先在贵宝地占个位置,如果想到再贴上来~~~~~>
9 楼
yjy2410578007 [专家分:60] 发布于 2007-08-23 12:36:00
对吗?谢谢
[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]
我来回复