有这么一个游戏:

写出一个11至NN的排列a_iai​,然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少11,直到只剩下一个数字位置。下面是一个例子:

3,1,2,43,1,2,4

4,3,64,3,6

7,97,9

1616

最后得到1616这样一个数字。

现在想要倒着玩这样一个游戏,如果知道NN,知道最后得到的数字的大小sumsum,请你求出最初序列a_iai​,为11至NN的一个排列。若答案有多种可能,则输出字典序最小的那一个。

[color=red]管理员注:本题描述有误,这里字典序指的是1,2,3,4,5,6,7,8,9,10,11,121,2,3,4,5,6,7,8,9,10,11,12

而不是1,10,11,12,2,3,4,5,6,7,8,91,10,11,12,2,3,4,5,6,7,8,9[/color]

输入输出格式

输入格式:

两个正整数n,sumn,sum。

输出格式:

输出包括11行,为字典序最小的那个答案。

当无解的时候,请什么也不输出。(好奇葩啊)

输入输出样例

输入样例#1: 复制

  1. 4 16
输出样例#1: 复制

  1. 3 1 2 4

说明

对于40\%40%的数据,n≤7n≤7;

对于80\%80%的数据,n≤10n≤10;

对于100\%100%的数据,n≤12,sum≤12345n≤12,sum≤12345。

一开始用模拟法  超时3个点

然后观察发现  累合的乘数为杨辉三角   用杨辉三角优化 超时2个点

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. //input
  4. #define rep(i,a,b) for(int i=(a);i<=(b);i++)
  5. #define repp(i,a,b) for(int i=(a);i>=(b);i--)
  6. #define RI(n) scanf("%d",&(n))
  7. #define RII(n,m) scanf("%d%d",&n,&m);
  8. #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
  9. #define RS(s) scanf("%s",s);
  10. #define ll long long
  11. #define inf 0x3f3f3f3f
  12. #define REP(i,N) for(int i=0;i<(N);i++)
  13. #define CLR(A,v) memset(A,v,sizeof A)
  14. //////////////////////////////////
  15. #define N 105
  16. int a[];
  17. int yhsj[][];
  18. int main()
  19. {
  20. int n;
  21. int sum;
  22. RII(n,sum);
  23. rep(i,,n)
  24. a[i]=i;
  25.  
  26. yhsj[][]=;
  27. rep(i,,n)
  28. rep(j,,i)
  29. yhsj[i][j]=yhsj[i-][j-]+yhsj[i-][j];
  30.  
  31. int b[];
  32. do
  33. {
  34. int all=;
  35. int ok=;
  36. rep(i,,n)
  37. {
  38. all+=a[i]*yhsj[n][i];
  39. if(all>sum){ok=;break;}
  40. }
  41. if(ok&&all==sum)
  42. {
  43. rep(i,,n)
  44. {
  45. if(i!=)
  46. printf(" ");
  47. printf("%d",a[i]);
  48. }
  49. break;
  50. }
  51.  
  52. }
  53. while(next_permutation(a+,a++n));
  54. return ;
  55. }

2 TLE

参考了大佬的做法

其实只要加一个关键剪枝即可

如果加到i处过不去了   把i及其后面的数降序排列好  下一个next就是 累合杨辉三角的最小值了  !!!!(因为杨辉三角中间大  两边小)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. //input
  4. #define rep(i,a,b) for(int i=(a);i<=(b);i++)
  5. #define repp(i,a,b) for(int i=(a);i>=(b);i--)
  6. #define RI(n) scanf("%d",&(n))
  7. #define RII(n,m) scanf("%d%d",&n,&m);
  8. #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
  9. #define RS(s) scanf("%s",s);
  10. #define ll long long
  11. #define inf 0x3f3f3f3f
  12. #define REP(i,N) for(int i=0;i<(N);i++)
  13. #define CLR(A,v) memset(A,v,sizeof A)
  14. //////////////////////////////////
  15. #define N 105
  16. int a[];
  17. int yhsj[][];
  18. int main()
  19. {
  20. int n;
  21. int sum;
  22. RII(n,sum);
  23. rep(i,,n)
  24. a[i]=i;
  25.  
  26. yhsj[][]=;
  27. rep(i,,n)
  28. rep(j,,i)
  29. yhsj[i][j]=yhsj[i-][j-]+yhsj[i-][j];
  30.  
  31. do
  32. {
  33. int all=;
  34. int ok=;
  35. rep(i,,n)
  36. {
  37. all+=a[i]*yhsj[n][i];
  38. if(all>sum){ok=;sort(a+i,a++n,greater<int>()); break;}
  39. }
  40. if(ok&&all==sum)
  41. {
  42. rep(i,,n)
  43. {
  44. if(i!=)
  45. printf(" ");
  46. printf("%d",a[i]);
  47. }
  48. break;
  49. }
  50. }
  51. while(next_permutation(a+,a++n));
  52. return ;
  53. }

其实这题用dfs回溯法更见简单高效   上面那个剪枝其实很难想到

不要过度依赖STL  有时候效率非常低下

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. //input
  4. #define rep(i,a,b) for(int i=(a);i<=(b);i++)
  5. #define repp(i,a,b) for(int i=(a);i>=(b);i--)
  6. #define RI(n) scanf("%d",&(n))
  7. #define RII(n,m) scanf("%d%d",&n,&m);
  8. #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
  9. #define RS(s) scanf("%s",s);
  10. #define ll long long
  11. #define inf 0x3f3f3f3f
  12. #define REP(i,N) for(int i=0;i<(N);i++)
  13. #define CLR(A,v) memset(A,v,sizeof A)
  14. //////////////////////////////////
  15. #define N 105
  16.  
  17. int a[];
  18. int yhsj[][];
  19. int vis[];
  20. int sum,n;
  21. int ok=;
  22. int ans[];
  23. void dfs(int now,int all)
  24. {
  25. if(ok)return ;
  26. if(now==n+&&all==sum)
  27. {
  28. ok=;
  29. rep(i,,n)
  30. {
  31. if(i!=)
  32. printf(" ");
  33. printf("%d",ans[i]);
  34. }
  35. return ;
  36. }
  37. rep(i,,n)
  38. {
  39. if(vis[i])continue;
  40. if(all+i*yhsj[n][now]>sum)continue;
  41. vis[i]=;
  42. ans[now]=i;
  43. dfs(now+,all+i*yhsj[n][now]);
  44. vis[i]=;
  45. }
  46. return ;
  47. }
  48. int main()
  49. {
  50. RII(n,sum);
  51. rep(i,,n)
  52. a[i]=i;
  53.  
  54. yhsj[][]=;
  55. rep(i,,n)
  56. rep(j,,i)
  57. yhsj[i][j]=yhsj[i-][j-]+yhsj[i-][j];
  58.  
  59. dfs(,);
  60.  
  61. return ;
  62. }

P1118 [USACO06FEB]数字三角形`Backward Digit Su`… 回溯法的更多相关文章

  1. P1118 [USACO06FEB]数字三角形`Backward Digit Su`…

    题目描述 FJ and his cows enjoy playing a mental game. They write down the numbers from 11 to N(1 \le N \ ...

  2. P1118 [USACO06FEB]数字三角形Backward Digit Su…

    题目描述 FJ and his cows enjoy playing a mental game. They write down the numbers from 1 to N (1 <= N ...

  3. 洛谷—— P1118 [USACO06FEB]数字三角形Backward Digit Su…

    https://www.luogu.org/problem/show?pid=1118#sub 题目描述 FJ and his cows enjoy playing a mental game. Th ...

  4. P1118 [USACO06FEB]数字三角形`Backward Digit Su`… (dfs)

    https://www.luogu.org/problemnew/show/P1118 看的出来是个dfs 本来打算直接从下到上一顿搜索 但是不会 看了题解才知道系数是个杨辉三角....... 这样就 ...

  5. 洛谷P1118 [USACO06FEB]数字三角形`Backward Digit Su`…

    #include<iostream> using namespace std ; ; int y[N][N]; int n; int a[N]; bool st[N]; int sum; ...

  6. luoguP1118 [USACO06FEB]数字三角形`Backward Digit Su`… 题解

    一上午都在做有关搜索的题目,,, 看到这题之后就直接开始爆搜 结果只有70分, 其余的点硬生生的就是那么WA了. 我的天哪~ 70分代码: #include<iostream> #incl ...

  7. Luogu P1118 [USACO06FEB]数字三角形 Backward Digit Sums | 搜索、数学

    题目链接 思路:设一开始的n个数为a1.a2.a3...an,一步一步合并就可以用a1..an表示出最后剩下来的数,不难发现其中a1..an的系数恰好就是第n层杨辉三角中的数.所以我们可以先处理出第n ...

  8. 【洛谷P1118】数字三角形

    数字三角形 题目链接 4 16 3 1 2 4 3 1 2 4 (3+1) (1+2) (2+4)(3+1+1+2) (1+2+2+4) (3+1+1+1+2+2+2+4)16=1*3+3*1+3*2 ...

  9. [USACO06FEB]数字三角形

    题目描述 FJ and his cows enjoy playing a mental game. They write down the numbers from 1 to N (1 <= N ...

随机推荐

  1. SP2-0734: 未知的命令开头 "exp wlc/ra..." - 忽略了剩余的行。

    SP2-0734: 未知的命令开头 "exp wlc/ra..." - 忽略了剩余的行. 原来只需要在  $exp wlc/radial_wlc123@ora11g owner=w ...

  2. linux流量异常查看哪些程序占用的

    Linux下进程/程序网络带宽占用情况查看工具 -- NetHogs   http://www.vpser.net/manage/nethogs.html   来自.  最后略有修改 之前VPS侦探曾 ...

  3. npm cnpm +nodejs

    nodejs win+r  打开cmd.命令:1.node -v   (查看版本信息)2.npm -v  (查看版本信息)3.npm install -g cnpm –registry=https:/ ...

  4. MSChart的研究(转)

    介绍MSChart的常用属性和事件 MSChart的元素组成 最常用的属性包括 ChartAreas:增加多个绘图区域,每个绘图区域包含独立的图表组.数据源,用于多个图表类型在一个绘图区不兼容时. A ...

  5. Confluence 6 发送 Confluence 通知到其他 Confluence 服务器

    你可以配置 Confluence 服务器向其他的 Confluence 服务器发送消息.在这种情况下,Confluence 服务器将不会显示 workbox. 希望发送消息到其他 Confluence ...

  6. 剑指offer 二叉树的层序遍历

    剑指offer 牛客网 二叉树的层序遍历 # -*- coding: utf-8 -*- """ Created on Tue Apr 9 09:33:16 2019 @ ...

  7. JSP 指令 脚本元素 表达式 声明

    一.page指令 1. 可以使用page指令来控制JSP转换器转换当前JSP页 面的某些方面.例如,可以告诉JSP用于转换隐式对象 out的缓冲器的大小.内容类型,以及需要导入的Java 类型,等等. ...

  8. jenkins默认会存放目录

    jenkins默认会存放在用户主目录下的.jenkins文件夹中 如:Linux root用户:/root/.jenkins 注意:这是linux版本的.windows系统请自行更改.这个值在Jenk ...

  9. python 内置数据类型之数字

    目录: 1.2. 数字 1.2.1. 数字类型 1.2.2. 浮点数 1.2.3. 进制记数 1.2.4. 设置小数精度 1.2.5. 分数 1.2.6. 除法 1.2 数字   1.2.1 数字类型 ...

  10. 论文阅读笔记九:SEMANTIC IMAGE SEGMENTATION WITH DEEP CONVOLUTIONAL NETS AND FULLY CONNECTED CRFS (DeepLabv1)(CVPR2014)

    论文链接:https://arxiv.org/abs/1412.7062 摘要 该文将DCNN与概率模型结合进行语义分割,并指出DCNN的最后一层feature map不足以进行准确的语义分割,DCN ...