T1.hanoi

题目描述
众所周知, 汉诺塔是一个古老又经典的游戏. 这个游戏是这样的, 你有 N 个大小不同的盘子和3 根柱子, 一开始所有盘子都叠放在第 1 根柱子上, 你需要把N 个盘子全都移动到第3根柱子上, 每次都可以选择某根柱子最上面的盘子移动到另一根柱子上, 但是任何时候都必须保证没有一个盘子上面放了一个比它大的盘子. 求最少的移动步数.
这个问题太简单了, 乐于寻找挑战的你想要求出当有N 个盘子, M 个柱子且其他条件不变时, 把所有盘子从第1 根柱子移动到第M根柱子的最少步数.

输入格式
一行两个整数分别代表题目中的 N, M.
输出格式
一行一个整数代表答案.

样例
hanoi.in
5 3
hanoi.out
31

数据范围
对于10%的数据, N <= 20, M = 3.
对于30%的数据, M = 3.
对于50%的数据, M <= 4.
对于100%的数据, N <= 63, 3 <= M <= N + 1;

分析:
以前做过汉诺塔变式
所以当M=3的时候,秒出答案:2^N-1

考试的时候玄学卡过70
提交之后听男生们说是O(N^2M)的做法(yhzq还有O(N)做法,%%%)

说正解之前,先看一下我在考场上写的:

else if (m==4)
{if (n<=6) printf("%d\n",2*m-3+(n-m+1)*4);else {ll ans=(ll)(1<<(n-3));ans+=9;printf("%llu\n",ans);}
}

我发现当只有3个盘子的时候,我们可以很简单的完成操作:

于是我就手玩了M=4,N<=6的情况,发现是一个等差数列,正当我以为我发现了天地真理的时候,我发现N=7的情况下不符合等差了(答案是25)
但是再快提交的最后十分钟,我发现对于超过6个盘子的情况,都可以通过以下方式得到最优解:

实际上这已经提示我们正解了:

设f[i][j]表示有i个盘子,利用j个柱子把ta们有序的排列在一个柱子上的最小步数

我们需要把i个盘子上的k个盘子利用j个柱子(其他的盘子都比ta们大,不影响)移动到另外的一个柱子上
把剩下的盘子利用j-1个柱子(有一个被前k个盘子占了)移动到第j个柱子上,
之后再把那k个也移动到第j个柱子上

f[i][j]=min{f[k][j-1]+f[i-k][j-1]+f[k][j-1]}=min{f[k][j-1]*2+f[i-k][j-1]}

注意枚举顺序:
我们先枚举盘子的个数
不要忘了f[1][j]=1

//这里写代码片
#include<cstdio>
#include<cstring>
#include<iostream>
#define ll unsigned long longusing namespace std;int n,m;
ll f[100][100];int main()
{//freopen("hanoi.in","r",stdin);  //freopen("hanoi.out","w",stdout);scanf("%d%d",&n,&m);for (int i=1;i<=n;i++)f[i][3]=(1ULL<<i)-1;                   //注意写法,不然会爆掉 // f[i][3]=(ll)1<<i,f[i][3]--;   这样也行,但是不要随意就把两个计算合在一起for (int j=4;j<=m;j++){f[1][j]=1;                             //1~n都要计算 for (int i=2;i<=n;i++){f[i][j]=(ll)0x7fffffffffffffff+1;for (int k=1;k<i;k++)              //k<if[i][j]=min(f[i][j],2*f[k][j]+f[i-k][j-1]);}}printf("%llu",f[n][m]);return 0;
}

T2.rank

题目描述
刚刚学会后缀数组的你(不会的先不要着急)在做完模板题”求后缀排名”之后把输入文件弄丢了, 只留下了输出文件, 作为一个强迫症患者, 你一定要找出一个输入文件能够对应上你的输出文件.
题目是这样的: 给出一个只由小写字母(‘a’-‘z’)组成的字符串的每个后缀的排名(也就是这
个后缀在所有后缀中字典序排第几), 你需要找到一个满足这个排名的原串, 原串也只能由小
写字母组成.如果有多个串满足条件, 输出字典序最小的串, 如果无解, 输出-1.

输入格式
第一行一个整数N, 代表字符串的长度. 接下来一行N 个整数, 第i个数代表以i 开头的
后缀的排名, 保证输入的数是一个排列.
输出格式
如果无解,输出-1.
否则输出一个长度为 N 的字符串代表答案.

样例
rank.in
3
1 2 3
rank.out
aab

数据范围
对于20%的数据, N <= 10.
对于50%的数据, N <= 1000.
对于100%的数据, N <= 200000.

分析:
考试的时候,我一直以为这是道图论(就像差分约束之类的),但是乱搞出来只过了一个点

实际上就是一道乱搞:
对于后缀排名最小的那个位置, 不妨令ta为 a
为了让构造出来的字符串字典序最小,我们本能的想到要让使用的最大字符尽量小
也就是说,能够相同的字符就让ta们相同好了

那么什么样的字符能够相同呢?

对于两个排名相邻的位置i, j,rank[i] < rank[j],
要使i,j的字符相同但是排名有先后之分,一定是ta们后面的某个字符造成的
如果rank[i+1] < rank[j+1],那么i和j位置上的字符就能够相同, 否则不能
那么从排名为1的往后推就可以了
因为我们在推的时候遵循的就是一种贪心的原则,所以构造出来的就是字典序最小的解

无解有两种情况:

  • 原本已经确定的答案和之后的条件不符
  • 为了构成输入数据,需要的字符超过26种
//这里写代码片
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>using namespace std;const int N=200010;
int n,rak[N];
struct node{int bh,k;bool operator < (const node &a) const{return k<a.k;}
};
node a[N];
int ans[N];int main()
{//freopen("rank.in","r",stdin);  //freopen("rank.out","w",stdout);scanf("%d",&n);for (int i=1;i<=n;i++){scanf("%d",&rak[i]);a[i].bh=i; a[i].k=rak[i];}sort(a+1,a+1+n);  memset(ans,0x33,sizeof(ans));ans[a[1].bh]=1;for (int i=2;i<=n;i++){int pre=a[i-1].bh;int nxt=a[i].bh;if (rak[pre]<rak[nxt]&&ans[pre]>ans[nxt])      //答案与条件相矛盾{printf("-1");return 0;}if (rak[pre+1]<rak[nxt+1])          //不用担心+1之后>n,因为rak[编号大于n的元素]=0 ans[nxt]=ans[pre];else ans[nxt]=ans[pre]+1;if (ans[nxt]>26)                   //需要的字符大于26种{printf("-1");return 0;}  }  for (int i=1;i<=n;i++)printf("%c",'a'+ans[i]-1);return 0;
}

T3.tree

与dalao学校的联shou考wan(11.2)(dp+乱搞+树形dp+期望)相关推荐

  1. 与DB某学校的联zha考chuan(11.1)(鸽巢+乱搞+x^2的转化)

    这次联考,是我近年来最炸穿的一次... T1.set 题目描述 你手上有N个非负整数, 你需要在这些数中找出一个非空子集, 使得它的元素之和能被N整除. 如果有多组合法方案, 输出任意一组即可. 注意 ...

  2. 【转】联普多WAN口路由器是否可以设置叠加带宽

    TP-link联普是全球领先的通讯供应厂商之一,那么你是否知道联普多WAN口路由器可以设置叠加带宽吗?下面是学习啦小编整理的一些关于联普多WAN口路由器是否可以设置叠加带宽的相关资料,供你参考. 联普 ...

  3. P4383 [八省联考2018]林克卡特树(树形dp+wqs二分)

    [八省联考2018]林克卡特树 题目大意:给定一棵有负权边的树,现在必须恰好删去 k k k条边,并加上恰好 k k k条权值为 0 0 0的边,要求最大化它的直径长度. 首先考虑删去 K K K条边 ...

  4. 【题库】上海市学校心理咨询师-普通心理学-考点解析 11.2 智力理论

    上海学校心理咨询考试时间:每年6月底7月初. 小白心理将会在2021年的考试前,平均每天更新1个考前冲刺视频,欢迎各位关注. 一.讲解视频 [题库]上海市学校心理咨询师-普通心理学-考点解析 11.2 ...

  5. 楼主考南师计算机学硕,南京师范大学考研详解:据说这所学校不太好考?嗯,是真的!...

    学校:南京师范大学 地区:江苏省 属性:"211工程"院校."双一流"世界一流学科建设高校 关于南师大 南京师范大学,地处江苏南京,拥有绝佳的地理位置.在全国第 ...

  6. 计算机考研380分能上什么学校,考研总分500考380难吗 能上什么学校

    对于考研的同学来说,多少分算高分?考研380分好考吗?下文有途网小编给大家整理了考研380分的水平及可以上的大学,供参考! 考研打380分难度大吗 考大学和考研不相同,考大学是众人一张卷,最后比较分数 ...

  7. 计算机日语考研的学校,专科日语考研考什么学校

    关于专科日语考研考什么学校最佳答案 1.楼主可以先看一下全国高校2009年日语专业排名情况: 排名 学校名称 等级 排名 学校名称 等级 排名 学校名称 等级 1 北京外国语大学 A+ 5 北京大学 ...

  8. 计算机考研学校好又好考的是,考研最容易的985大学 考研院校难度排名

    考研不容易,考985名校更是困难加倍.下文有途网小编给大家整理了考研难度985院校排名情况,供参考! 985大学考研难度排名 考研难度第一档:北京大学.清华大学. 考研难度第二档:复旦大学.中国人民大 ...

  9. 山东春考计算机专业本科学校排名,山东春考大学本科排名及名单

    山东省自2012年起,普通高校考试招生实行以国家统一考试为主.面向不同学生类型的分类考试办法,即普通高校考试招生分春季高考与夏季高考. 山东春考学校有哪些 序号学校名单 1.淄博职业学院 2.山东交通 ...

  10. 计算机二级学校错,计算机二级考不过,是有原因的!

    原标题:计算机二级考不过,是有原因的! 计算机等级考试,不仅要拿到证书,更是要借这次备考的机会,好好提升一下自己的技能 ,很多学校除了开设最基本的大学计算机基础之外,还开设了专门的课程,如经管类专业, ...

最新文章

  1. 牛客练习赛32 -- Xor Path
  2. sprintf,你知道多少?
  3. Android 4.1最终版SDK和ADT Plugin全线发布
  4. 青岛理工邀请赛(难受的一次经历)之显示屏(按着倍数放大数字)
  5. java内部类外部类_Java内部类:如何在内部类中返回外部类对象
  6. Beego 学习笔记9:Boostrap使用介绍
  7. window挂载到linux服务器上,在windows 7操作系统下设置挂载Linux服务器
  8. 【英语学习】【English L06】U06 Banking L6 Do you use online banking?
  9. 添加lua_非关系型数据库Redis之Lua脚本
  10. C++_选择结构_switch语句_循环结构while_while案例猜数字_do while循环_dowhile案例水仙花数_---C++语言工作笔记017
  11. php 上传 excel xlsx_在PHP中创建和编辑Excel电子表格
  12. Apache常见配置及问题
  13. tortoisegit pull 远程拉取代码,提示需要密码
  14. 学计算机二级考试的软件,2020计算机二级考试宝典
  15. 噪声概念:白噪声(n)、粉红噪声(1/f)
  16. 修改docker时区为北京时间
  17. itpt_TCPL 第一章:C简要教程
  18. 数学与物理桥梁下的鸟瞰
  19. Transition of CSS3
  20. EA周报 | 阿里港交所上市筹集资金可达200亿美元;预测华为自主系统“鸿蒙”手机10月上市;上海证券交易所科创板正式开板...

热门文章

  1. #LeetCode15. 三数之和 @FDDLC
  2. 华硕a53s拆机图解_华硕a53s配置 功能与外观描述【图解】
  3. 解决百度推送not_same_site的问题
  4. fast虚拟服务器ip地址设置,迅捷路由器静态ip怎么设置_迅捷固定IP地址怎么设置?-192路由网...
  5. 深度学习在搜索推荐领域的应用(一次阿里云天池平台技术分享)
  6. 英语单词辨析(同类单词)
  7. Sleepy Cow Sorting犯困的奶牛排序(思维)
  8. squid高性能代理缓存服务器
  9. Android点将台:颜值担当[-Activity-],项目实践
  10. ThreadPoolExecutor线程池 —————— 开开开山怪