多米诺骨牌

递推+高精度

【问题描述】

Jzabc 对多米诺骨牌有很大兴趣,然而他的骨牌比较特别,只有黑色的和白色的两种。他觉得如果存在连续三个骨牌是同一种颜色,那么这个骨牌排列便是不美观的。现在他有 n 个骨牌要排列,他想知道不美观的排列的个数,由于数字较大,数学不好的他不会统计,所以他请你来帮忙。希望你在一秒内求出不美观的排列的个数

【输入】

只有一个正整数,即要排列的骨牌个数

【输出】

一个数,即不美观的排列个数。

【输入样例】

4

【输出样例】

6

【Hint】

有六种不美观的排列:

黑黑黑黑,白白白白,黑黑黑白,白白白黑,黑白白白,白黑黑黑

【数据范围】

20%的数据,n≤60;

50%的数据,n≤600;

100%的数据,n≤20000。

【解题过程】

一点思路都没有,就用搜索打了个表,发现了点规律。用 f(i) 表示有 i 个骨牌时的不美观的排列数,则可以发现 f(i)-2*f(i-1) = 2*fib(i-3)(fib 表示斐波那契数列,具体是 fib(i-3) 还是 fib(i-2) 我也忘了)。那么就可以递推了,但是由于 n 会达到 20000,所以不得不用高精度。如果用普通的高精度加法,由于最后结果长达 6000 位,很明显会 TLE。所以当然要用高大上的万进制。但是效果依然不好,于是我丧心病狂地开了 long long 并采用 10^18 进制。效率的提升是很明显的,即使是 20000 几乎也能马上出解。

但是在调的过程中发现一点不对劲,如果我用 10^16 进制,得到的答案和 10^18 进制得到的答案不一样,具体表现为漏了一些 0。然后恍然大悟,所有 10 的幂进制高精度都需要注意的地方,就是最后输出的时候,除了最前面的部分,后面的那些数字如果位数不够要补 0,比如对于万进制,某个数组元素存放的值是 1,其对应的值其实是 0001,这个值如果是在整个数的开头那么不必加 0,如果是在中间则必须加 0。

但是还是要写一下为什么存在这个规律。如果我们考虑美观的情况,f(i) 可以分两种情况:第 i 个与第 i-1个同色或不同色。则 f(i) = f(i-2)+f(i-1)。

第一次提交 AC。

 

超车

求逆序对

【问题描述】

Jzabc 除了对多米诺骨牌感兴趣外,对赛车也很感兴趣。上个周末他观看了一场赛车比赛。他总是能想出许多稀奇的问题。某一时刻,他看到有 n 辆车(总是匀速行驶)在同一直线上,并且处在一个无限长度的直道上。而且 n 辆车有严格的先后之分。他通过特殊的器材测出了每一辆车的速度。那么问题出现了,如果有两辆车 A 车和 B 车,A 车在 B 车的后面,并且 A 车的速度比 B 车快,那么经过一段时间后,A 车一定会超过 B 车。我们称之为一次超车。那么他想请你帮忙计算超车总数。我们记车道起点的坐标为 0,没有两辆车的坐标相同。

【输入】

第一行,一个数 n,车辆总数。以下 n 行为 n 辆车的信息:

第二行至第 n+1 行,每行两个正整数 x,y,分别表示车的坐标和车的速度。0<x,y≤1000000000。

【输出】

一行,超车总数。

【输入样例】

2

5 6

2 8

【输出样例】

1

【数据规模】

20%的数据,n≤300;

50%的数据,n≤3000;

100%的数据,n≤300000。

【解题过程】

好裸的逆序对。

但是写归并排序还是没有一次写对,后面发现循环里没有处理元素大小相同的情况。

注意做归并排序之前还要先按坐标对这些车进行排序。

 

最小奖励

动态规划

【问题描述】

Jzabc 更是一个狂热的旅游爱好者。这次他想去一个诡异的地方。这个地方有 n 个村庄,编号为1 到 n。此刻他在 1 号村庄,他想去 n 号村庄。这 n 个村庄之间有 m 条单向道路。通过某些道路时,可能会花费一些钱作为"买路钱",可是通过一些道路时,不仅不需要交"买路钱",而且会得到一些奖励(这就是诡异的地方?)。当然两个村庄之间可能有多条直接相连的道路,但是每一条道路只能通过一次。这些村庄有这样的特性,从任何一个村庄出发,沿着任一条路径走都不会回到出发点。找到一条路径从 1 号村庄到 n 号村庄后,他需要计算一共得到多少奖励,一共交了多少"买路钱"。如果得到的总奖励钱数大于交的"买路钱"数,那么称走这一条路径可以得到奖励;相反,如果前者小于后者,那么称走这一条路径需要花费。如果两者相等,那么 Jzabc 不会选这一条路(我也不知道他为什么不选这一条路径)。不会出现所有的路径两者都相等。他又需要你的帮助,让你找一条路径,使他得到的奖励最小(为什么不是最大的奖励?),并输出最小奖励。如果找不到一条路径能使他得到奖励,那么就找一条路径使他得到的花费最大(为什么就不是最小的花费?),并输出最大花费。

【输入】

第一行两个正整数 n 和 m,n 是村庄数,m 是道路数。

以下 m 行,每行三个数 x,y,w,表示 x 为起点,y 是终点,若 w 为正,则是通过此条道路得到的奖励;若 w 为负,则是通过此条道路交的"买路钱"。w≠0 且|w|≤10。

【输出】

一个整数。若有最小奖励,则输出。否则输出最大花费。

【输入样例】

【数据规模】

20%的数据,n≤20,m≤200;

50%的数据,n≤50,m≤2000;

100%的数据,n≤100,m≤20000。

【解题过程】

首先从题目描述上看是个 DAG。那么我们就可以用布尔型的 f(i, j) 表示从节点 1 走到节点 i 权值之和能否等于 j。由于存在负数,所以我们给它加一个偏移量,也就是说把「0」设置为 1001,则小于 1001 的数就表示负数。

一开始还想用拓扑排序先求一遍顺序再按拓扑序来 DP,但是发现可以直接记忆化搜索,它自然会按照拓扑序来完成。注意把边反向才能不用拓扑排序而直接记忆化搜索做。

第一次提交 AC(其实是爆0但那是数据问题)。

09day2的更多相关文章

  1. 二模09day2解题报告

    T1.domino骨牌 n张有黑有白的骨牌排一排,连续三张同色排一起就不好看,求共多少方案不好看. 分析一下,f[3]=2,f[4]=6,f[n]:如果n-1==n 那么方案数为f[n-2],如果不同 ...

随机推荐

  1. malloc/free 和 new/delete 的区别

    1.malloc在C和C++中的区别 1.1.C中可以将任意的指针赋值给void*类型的变量.也可以将void*类型的值赋值给通常的指针变量. ---------------------------- ...

  2. ubuntu系统使用minicom终端操作说明

    http://blog.chinaunix.net/uid-22030783-id-3350834.html 在linux下,使用minicom作为串口终端工具,默认的串口设备是/dev/ttyS0, ...

  3. 教你使用UIWindow实现窗口的切换

    这两天写了一个手势解锁,该死的需求要求这个手势解锁页面各种出现,毕竟人家这个客户端酒20多个领导用用的,怕泄密就加了各种保密措施.先来看下需求:1.用户注册登录后跳转设置手势页面(必须设置).2.ap ...

  4. delphi中的Label控件背景透明

    Label1.Transparent:=true;你在它的属性窗口把它的Transparent属性改成TRUE就行了 来自为知笔记(Wiz)

  5. QT 读取文件夹下所有文件(超级简单的方法,不需要QDirIterator)

    之前,用标准C++写过读取文件夹.现在用QT重写代码,顺便看了下QT如何实现,还是相当简单的.主要用到QDir,详细文档可见这里 A program that lists all the files ...

  6. 把Message转换成String

    把Message转换成String注意,这里欠缺CM消息和CN消息,因为它们不是系统消息,不经过Dispatch API转发,但是可以把它们写在WndProc里,这样SendMessage送来的消息也 ...

  7. CentOS单用户模式下修改ROOT密码和grub加密

    Linux 系统处于正常状态时,服务器主机开机(或重新启动)后,能够由系统引导器程序自动引导 Linux 系统启动到多用户模式,并提供正常的网络服务.如果系统管理员需要进行系统维护或系统出现启动异常时 ...

  8. 从一个前端项目实践 Git flow 的流程与参考

    Git flow 出自 A successful Git branching model,这里使用了一个前端项目配合本文稿实施了 git flow 并记录流程作出示例和参考,对 hotfix 与持续部 ...

  9. USACO Section 3.2: Feed Ratios

    直接暴力搜 /* ID: yingzho1 LANG: C++ TASK: ratios */ #include <iostream> #include <fstream> # ...

  10. 习惯&感恩

    A不喜欢吃鸡蛋,都给了B吃,刚开始B很感谢,久而久之便习惯了.习惯了,便理所当然了. 后来有一天,A将鸡蛋给了C,B就不爽了.她忘记了这个鸡蛋本来就是A的,A想给谁都可以. 为此,她们大吵一架,从此绝 ...