237 条题解
-
0jia_m LV 3 @ 2006-09-29 14:05:46
说实话,偶题都没读懂!!
汗啊~~~~~~~~~~~~~ -
02006-09-29 13:51:01@
我忍了,原来这题这么瓜。规律就是有那么一点不好找啊!还是看了别人的题解在搞出来,悲哀啊!!
关键就是 a[i]:=a+a[i div 2]
你们说常人怎么会考虑到这个??? -
02006-09-28 14:55:20@
最简单的递推,也可用动态方程啊
-
02006-08-29 22:02:44@
第一个数据好像是0…………
我的正确率啊……………… -
02006-08-29 22:00:34@
郁闷,luchumingq的说法我的确没看懂,不知道他在讲什么,希望有作出来的同学帮忙指点一下,谢谢
-
02006-08-29 17:10:20@
无穷次后项减前项以后(同样的两项看作一项,如:2 2看作2;4 4看作4)得出一恒不变的数列:
1 2 2 4 4 6 6 10 10 14 14 20 20 26 26 36 36 46 46 60 60 74 74 94 94 114 114 140 140 166 166 202 202 238 238......
将上述数列再次后项减前项以后(规则相同,两项相同的看作一项):
1 2 2 4 4 6 6 10 10 14 14 20 20 26 26 36 36 46 46...
看到没?和上面第一个数列完全相同,这个就是规律.....
奇怪的数列..... -
02006-08-13 13:01:42@
A[奇数]:=A[奇数-1];
A[偶数]:=A[偶数 DIV 2]+A[偶数-1]; -
02006-07-17 12:46:37@
递归在算 n>400 后会超时,用递推。
-
02006-07-05 01:04:46@
深搜模拟。因为有很多数的“计数”要重复,为了提高速度,可以用一个数组来记录每个数的“计数”。当搜索到的这个数的计数已知时,则直接调用已知的计数;当搜索到的这个数的计数未知时,则利用深搜求这个数的计数,最后记录到数组中,则这个数的计数就已知了。注意每种情况都可以“不做任何处理”,所以用加0表示“不做任何处理”。因而初始值a[0]:=1;a[1]:=1;
-
02006-08-29 22:15:26@
[递推]s[i]=s[i div 2]+s+1
-
02006-04-26 17:03:15@
直接抽象为数学问题
每次递归找一半就行了。 -
02006-04-23 11:31:04@
转成树,一个递归来计算节点数目,另外,因为数据量比较大,所以,用一个数组来记忆搜索过的结果就好了。
题目有点诡异,我的第一个数据没有输出,其他数据都过了,过了的人教教我。谢谢!
fluke at sfcube.net -
-12016-09-25 20:39:27@
#include<iostream>
using namespace std;
int h[1001];
int main()
{
int n;
cin>>n;
h[1]=1;
for(int i=2;i<=n;i++)
{
h[i]=h[i-1];
if(i%2==0)h[i]=h[i-1]+h[i/2];
}
cout<<h[n];
return 0;
} -
-12016-09-06 20:36:01@
评测结果 编译成功 测试数据 #0: Accepted, time = 0 ms, mem = 508 KiB, score = 10 测试数据 #1: Accepted, time = 0 ms, mem = 508 KiB, score = 10 测试数据 #2: Accepted, time = 0 ms, mem = 508 KiB, score = 10 测试数据 #3: Accepted, time = 0 ms, mem = 508 KiB, score = 10 测试数据 #4: Accepted, time = 0 ms, mem = 508 KiB, score = 10 Accepted, time = 0 ms, mem = 508 KiB, score = 50 代码 #include <cstdio> int main() { int dp[1001],n; dp[1] = 1; scanf("%d",&n); for (int i = 2;i <= n;i++) { dp[i] = dp[i-1]; if (!(i%2)) dp[i] += dp[i/2]; } printf("%d",dp[n]); return 0; } 评测结果 编译成功 测试数据 #0: Accepted, time = 0 ms, mem = 504 KiB, score = 10 测试数据 #1: Accepted, time = 0 ms, mem = 512 KiB, score = 10 测试数据 #2: Accepted, time = 0 ms, mem = 508 KiB, score = 10 测试数据 #3: Accepted, time = 0 ms, mem = 508 KiB, score = 10 测试数据 #4: Accepted, time = 0 ms, mem = 508 KiB, score = 10 Accepted, time = 0 ms, mem = 512 KiB, score = 50 代码 #include <cstdio> int main() { int n,ans = 1; scanf("%d",&n); for (int i = 1;i <= n/2;i++) { ans++; for (int j = 1;j <= i/2;j++) { ans++; for (int k = 1;k <= j/2;k++) { ans++; for (int l = 1;l <= k/2;l++) { ans++; for (int i1 = 1;i1 <= l/2;i1++) { ans++; for (int j1 = 1;j1 <= i1/2;j1++) { ans++; for (int k1 = 1;k1 <= j1/2;k1++) { ans++; for (int l1 = 1;l1 <= k1/2;l1++) ans++; } } } } } } } printf("%d",ans); return 0; }
-
-22017-08-01 15:06:55@
递归
#include<iostream> using namespace std; int ans; void dfs(int m) { int i; ans++; for(i=1;i<=m/2;i++) dfs(i); } int main() { int n; cin>>n; dfs(n); cout<<ans; return 0; }
-
-22017-06-25 21:46:09@
其实递归可能会好理解一些
#include<iostream> using namespace std; int gb(int m) { int c=1,i; if(m==1) return 1; for(i=1;i<=m/2;i++) { c+=gb(i); } return c; } int main() { int n; cin>>n; cout<<gb(n); return 0; }
-
-22016-08-27 10:57:21@
SB题,O(n)可过,贴一个python
python
f = {1 : 1}
s = {0 : 0, 1 : 1}
for i in range(2, 1001):
f[i] = f[i-1] + s[i/2] - s[(i-1)/2]
s[i] = f[i] + s[i-1]
n = int(raw_input())
print f[n]