华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1159|回复: 4
打印 上一主题 下一主题

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

[复制链接]

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
跳转到指定楼层
楼主
发表于 2018-8-20 11:12:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
https://www.luogu.org/problemnew/show/P1118

有这么一个游戏:

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

3,1,2,4

4,3,6

7,9

16

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

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

管理员注:本题描述有误,这里字典序指的是1,2,3,4,5,6,7,8,9,10,11,12而不是 1,10,11,12,2,3,4,5,6,7,8,9
输入输出格式
输入格式:
两个正整数n,sum

输出格式:
输出包括1 行,为字典序最小的那个答案。

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

输入输出样例
输入样例#1
416
输出样例#1
31 2 4
说明
对于40%的数据,n7

对于 80% 的数据, n10

对于100%的数据, n12,sum12345


回复

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
沙发
 楼主| 发表于 2018-8-20 11:12:39 | 只看该作者
  1. #include<iostream>
  2. #include<cmath>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<cstdio>
  6. using namespace std;
  7. int n,sum,sum0;
  8. int a[20],b[20],c[20];
  9. void dfs(int p)
  10. {
  11.     if (sum0>sum) return;
  12.     if (p==n+1)
  13.     {
  14.         //cout<<sum0<<endl;
  15.         if (sum0==sum)
  16.         {
  17.             for (int j=1;j<=n;j++) cout<<c[j]<<' '; cout<<endl; sum=-1;
  18.         }
  19.         return;
  20.     }
  21.     for (int i=1;i<=n;i++)
  22.     {
  23.         if (b[i]) continue;
  24.         b[i]=1; c[p]=i; sum0+=a[p]*i;
  25.         dfs(p+1);
  26.         b[i]=0; sum0-=a[p]*i;
  27.     }
  28. }
  29. int main()
  30. {
  31. ///   freopen("backward.in","r",stdin);
  32. ///   freopen("backward.out","w",stdout);
  33.     cin>>n>>sum;
  34.     for (int i=1;i<=n;i++)
  35.     {
  36.         a[i]=1; a[1]=1;
  37.         for (int j=2;j<=i-1;j++) a[j]=b[j]+b[j-1];
  38.         for (int j=1;j<=i;j++) b[j]=a[j];
  39.     }
  40.     for (int i=1;i<=n;i++) b[i]=0;
  41.     sum0=0; dfs(1);
  42.     return 0;
  43. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
板凳
发表于 2018-8-20 13:41:00 | 只看该作者
不是可以用类似杨辉三角那样的公式去求得到吗?
回复 支持 反对

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
地板
 楼主| 发表于 2018-8-21 10:27:34 | 只看该作者
admin 发表于 2018-8-20 13:41
不是可以用类似杨辉三角那样的公式去求得到吗?

主程序里就是先算出了杨辉三角存起来了啊
回复 支持 反对

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
5#
 楼主| 发表于 2018-8-21 10:28:09 | 只看该作者
admin 发表于 2018-8-20 13:41
不是可以用类似杨辉三角那样的公式去求得到吗?

主程序里就是先算出了杨辉三角存起来了啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 06:37 , Processed in 0.274690 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表