博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Backward Digit Sums
阅读量:5953 次
发布时间:2019-06-19

本文共 2401 字,大约阅读时间需要 8 分钟。

FJ and his cows enjoy playing a mental game. They write down the numbers from 1 to N (1 <= N <= 10) in a certain order and then sum adjacent numbers to produce a new list with one fewer number. They repeat this until only a single number is left. For example, one instance of the game (when N=4) might go like this: 
3   1   2   4  4   3   6  7   9  16
Behind FJ's back, the cows have started playing a more difficult game, in which they try to determine the starting sequence from only the final total and the number N. Unfortunately, the game is a bit above FJ's mental arithmetic capabilities. 
Write a program to help FJ play the game and keep up with the cows.

输入

Line 1: Two space-separated integers: N and the final sum.

输出

Line 1: An ordering of the integers 1..N that leads to the given sum. If there are multiple solutions, choose the one that is lexicographically least, i.e., that puts smaller numbers first.

样例输入

4 16

样例输出

3 1 2 4

提示

Explanation of the sample: 
There are other possible sequences, such as 3 2 1 4, but 3 1 2 4 is the lexicographically smallest.

 题意:

我们把1-n这n个数的某个排列摆成一排,然后相邻两个数的和放到下一行,依此类推,形成一个三角形

3   1    2   4

   4   3   6

     7   9

      16

给你n和最终得到的和k,求第一行的系列(字典序最小)

我们可以发现每个数字的计算次数是一个杨辉三角

             1   1

          1    2    1

       1    3     3    1

   1     4     6      4     1

              ......

所以我们只要枚举1-n的全排列,计算sum{now[i]*as(n-1,i)}是否为K就行了

#include 
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long LL;const LL INF = 0xfffffff;const int maxn = 500;const LL MOD = 1e9+7;int ok[maxn], now[maxn], as[maxn][maxn], n, m, vis[maxn], flag; ///poj 3187void init(){ int i, j; as[0][0] = 1; for(i = 0; i <= 10; i++) { as[i][0] = as[i][i] = 1; for(j = 1; j < i; j++) as[i][j] = as[i-1][j] + as[i-1][j-1]; }}void dfs(int cnt){ if(flag )return ; if(cnt == n) { int ans = 0; for(int i = 0; i < n; i++) ans += as[n-1][i] * now[i]; if(ans == m) { flag = 1; for(int i = 0; i < n; i++) ok[i] = now[i]; } return ; } for(int i = 1; i <= n; i++) { if(!vis[i]) { vis[i] = 1; now[cnt++] = i; dfs(cnt); vis[i] = 0; cnt--; } } // return ; }int main(){ init(); while(~scanf("%d %d", &n, &m)) { flag = 0; memset(vis, 0, sizeof(vis)); dfs(0); printf("%d", ok[0]); for(int i = 1; i < n; i++) printf(" %d", ok[i]); printf("\n"); } return 0;}

  

转载于:https://www.cnblogs.com/PersistFaith/p/4832911.html

你可能感兴趣的文章
单例HashTable例子
查看>>
[CareerCup][Google Interview] Find kth number in a BST
查看>>
解决Putty中左边 alt+b 不工作的问题
查看>>
ORACLE批量更新四种方法比较
查看>>
web开发人员必备的提高开发水平的20个参考手册
查看>>
socat: Linux / UNIX TCP Port Forwarder
查看>>
HDOJ 2056
查看>>
2012年最佳免费网站和移动应用 PSD 界面素材揭晓
查看>>
github (远端建立分支....配置见github 官网配置)
查看>>
gjrand 4.0 发布,C语言的伪随机数生成器
查看>>
实战DeviceIoControl 之七:在Windows 9X中读写磁盘扇区
查看>>
简明Linux命令行笔记:locate
查看>>
EF Code First 学习笔记:约定配置
查看>>
自动完成文本框AutoCompleteTextView
查看>>
【Android】【录音】Android录音--AudioRecord、MediaRecorder
查看>>
微软开源C++ REST SDK——Casablanca
查看>>
技术能力与真不是几年经验成正比的
查看>>
文件IO open 与 标准 IO fopen 的对应
查看>>
“云经济”与创新
查看>>
cell smart restore from backup等待事件
查看>>