题意:有n个座位与n个人,每个座位都有对应的编号,分别从1-n,1号座位必须做1号,并且相邻位置的人的编号的差值不能超过2,求让n个人入座的方案数
链接:http://acm.timus.ru/problem.aspx?space=1&num=1260
思路:暴搜小数据,推规律
注意点:超出int范围,用long long
以下为AC代码:
ID | Date | Author | Problem | Language | Judgement result | Test # | Execution time | Memory used |
---|---|---|---|---|---|---|---|---|
6250279 |
20:31:18
16 May 2015 | luminous11 | 1260. Nudnik Photographer | G++ 4.9 C++11 | Accepted | 0.015 | 370 KB |
/*
***********************************************
*# @Author : Luminous11 (573728051@qq.com)
*# @Date : 2015-05-16 23:11:44
*# @Link : http://blog.csdn.net/luminous11
***********************************************
*/
#include <bits/stdc++.h>
#define clr(a, v) memset( a , v , sizeof(a) )
using namespace std;
const double eps = 1e-10;
const double pi = acos(-1.0);
int main()
{
long long dp[65];
dp[1] = dp[2] = 1;
dp[3] = 2;
dp[4] = 4;
for ( int i =5; i < 60; i ++ ){
dp[i] = dp[i-1] + dp[i-3] + 1;
}
int n;
while ( cin >> n ){
cout << dp[n] << endl;
}
return 0;
}
//以下为暴搜找规律代码
/*
int cnt = 0;
bool vis[20];
int P;
void dfs ( int val, int p )
{
if ( p == P ){
cnt ++;
return;
}
for ( int i = -2; i <= 2; i ++ ){
int tmp = val + i;
if ( tmp <= 0 || tmp > P )continue;
if ( vis[tmp] == 0 ){
vis[tmp] = 1;
dfs ( tmp, p + 1 );
vis[tmp] = 0;
}
}
}
int solve( int i )
{
cnt = 0;
P = i;
memset ( vis, 0, sizeof ( vis ) );
vis[1] = 1;
dfs ( 1, 1 );
return cnt;
}
int main()
{
ios::sync_with_stdio ( false );
for ( int i = 1; i < 15; i ++ ){
printf ( "%d : %d\n", i, solve( i ) );
}
while ( 1 );
return 0;
}
*/