3614 - 侦察兵

通过次数

0

提交次数

0

时间限制 : 2 秒 内存限制 : 128 MB

N个士兵站成一列,他们的编号分别为1......n,要求选出一些士兵,送他们去侦察.

为了达成这个目的,要执行若干次下列的操作: 如果这列的士兵不少于3个。则把所有的奇数编号的剔除

或者把所有偶数编号的剔除。

经过上述操作后,如果这列士兵数目刚好是3,则将他们送去侦察,如果小于个,则重新来过。

问题是,有被选去侦察的士兵有多少种?

注意,如果队列小于3个,不做考虑

0<=N<=10 000 000

题目输入

每一行输入N,直到输入流程结束。

题目输出

每行输出为对应的种类

输入/输出样例

输入格式

10
4

输出格式

2
0

C语言解答

#include <stdio.h>
int solve(int n)
{
	if(n<3)
	return 0;
	else if(n==3)
	return 1;
	else
	return (solve(n/2)+solve(n-n/2));
}
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		printf("%d\n",solve(n));
	}
	return 0;
}

C++解答

#include <bits/stdc++.h>
using namespace std;

int d[10000005];

int dp(int n)
{
	if (d[n]!=-1) return d[n];
	else
		return d[n]=dp(n/2)+dp(n-n/2);
}

int main()
{
	int n;
	while(~scanf("%d",&n)){
		
		memset(d,-1,sizeof(d));
		d[0]=d[1]=d[2]=0;
		d[3]=1;
		printf("%d\n",dp(n));
		
	}
	return 0;
}