擅长排列的小明 II
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
-
小明十分聪明,而且十分擅长排列计算。有一天小明心血来潮想考考你,他给了你一个正整数n,序列1,2,3,4,5......n满足以下情况的排列:
1、第一个数必须是1
2、相邻两个数之差不大于2
你的任务是给出排列的种数。
- 输入
- 多组数据。每组数据中输入一个正整数n(n<=55).
- 输出
- 输出种数。
- 样例输入
-
4
- 样例输出
-
4
- 来源
- Ural
- 上传者
- 李文鑫
-
解题:俺找规律才找出来的,开始写了个暴力搜索,输出前10项结果1 12 13 24 45 66 97 148 219 3110 46找到规律了吧。哈哈 先上超时代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <vector> 6 #include <climits> 7 #include <algorithm> 8 #include <cmath> 9 #define LL long long 10 using namespace std; 11 int d[51],n,cnt; 12 bool used[51]; 13 void dfs(int cur,int pre){ 14 if(cur > n) { 15 cnt++; 16 return; 17 } 18 int x = pre-2, y = pre+2; 19 for(x; x <= y && x <= n; x++){ 20 if(x >= 1 && !used[x]){ 21 used[x] = true; 22 dfs(cur+1,x); 23 used[x] = false; 24 } 25 } 26 } 27 int main(){ 28 while(~scanf("%d",&n)){ 29 cnt = 0; 30 memset(used,false,sizeof(used)); 31 used[1] = true; 32 for(int i = 1; i <= n; i++) d[i] = i; 33 dfs(2,1); 34 printf("%d\n",cnt); 35 } 36 return 0; 37 }
AC代码
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <vector> 6 #include <climits> 7 #include <algorithm> 8 #include <cmath> 9 #define LL long long 10 using namespace std; 11 int main(){ 12 int ans[60] = {1,1,1,2,4,6},i; 13 for(i = 4; i <= 55; i++) 14 ans[i] = ans[i-1]+ans[i-3]+1; 15 while(~scanf("%d",&i)) printf("%d\n",ans[i]); 16 return 0; 17 }
NYOJ 469 擅长排列的小明 II,布布扣,bubuko.com
时间: 2024-12-14 18:08:22