09day1
词编码
模拟
【问题描述】
一个发送机可以通过一条隧道发送一些以二进制代码组成的单词。在其尽头的接受机可以使用特殊技术恢复到最初的单词。每个单词最初都由0和1组成。所有的单词最初长度都为n(4<=n<=1000)。当穿过隧道之后单词可能发生以下几种情况之一:
(1)任意(一个)0 被 1 取代;
(2)任意(一个)符号被删除;
(3)一个符号(0 或 1)被插入到任何位置;
(4)不改变。
我们知道最初的单词都具有以下性质:有 1 的位置号的总和是 n+1 的倍数,或者是 0。
【输入】
n 和转换后的单词,每个单词占一行。单词数不大于 2001,不会有其他任何东西,除了空格和空行。
【输出】
你的程序应该打印输出原始序列的词,注意换行。
若有多解,操作 4 有限,不行则按操作 1、2、3 优先。同一操作,按操作位置最先的优先(从左到右数起 1、2、3…n)。对于操作 2,先在被删数列添 0,不行再添 1。
如果没有答案则输出-1。
【输入样例】
4
0000
011
1011
11011
【输出样例】
0000
0110
1001
1111
【解题过程】
按照题目要求的优先顺序依次模拟即可。
但是不能无脑模拟,要加优化。用 a[i] 记录 i...n 中有几个 1,用 b[i] 记录 i...n 中的 1 的位置和。然后模拟的时候就不用进行字符串的操作了。
第一次提交80 分。没有部分和优化超时两个点。
(虽然现在还没 A 掉但是我会尽量在 NOIP 之前把这道水题 A 掉以增加信心的。)
笨笨粉刷匠
动态规划
【问题描述】
笨笨太好玩了,农田荒芜了,彩奖用光了,笨笨只好到处找工作,笨笨找到了一份粉刷匠的工作。
笨笨有 n 条木板需要被粉刷。每条木板被分成 m 个格子,每个格子要被刷成红色或蓝色。笨笨每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色,已知每个格子最多只能被粉刷一次。
如果笨笨只能粉刷 t 次,他最多能正确粉刷多少格子。
一个格子如果未被粉刷或被粉刷成错误颜色,就算粉刷错误。
【输入】
第一行三个数 n,m,t;
接下来 n 行,每行一个长度为 m 的字符"0"表示红色,"1"表示蓝色。
【输出】
一个整数,最多能正确粉刷的格子数。
【输入样例】
3 6 3
111111
000000
001100
【输出样例】
16
【数据规模】
1≤n,m≤50,0≤t≤2500。
【解题过程】
很明显有个背包在里面,把 t 次粉刷分配给 n 块板,要求最大收益。所以我们只要计算出每块板粉刷 k 次所能得到的收益。
在这里纠结了很久,我最初的想法是O(N^6) 的动规(丧心病狂),用 f(a, i, j, k) 表示在木板 a 的区间 [i, j] 上粉刷 k 次能得到的最大收益,然后枚举中间点将其分为两个部分,并枚举左右两边各粉刷的次数。
然后又想了很久才想到比较靠谱的算法(是有多弱?):用 f(a, i, j) 表示在木板 a 的区间 [1, i] 上粉刷 j 次能得到的最大收益,则
f(a, i, j) = max{ f(a, k, j-1)+PAINT(k+1, i) }, 1<=k<i
其中PAINT(k+1, i) 取以下三种操作的最大收益:
- 将 [k+1, i] 整个区间涂成同一种颜色(显然应该涂格子数较多的那种颜色)
- 涂区间中最长的红色连续区间
- 涂区间中最长的蓝色连续区间
然后在预处理 PAINT(a, b) 的时候我又脑洞大开,开始准备写线段树求最长的连续颜色区间,后来想想貌似可以 RMQ?再后来发现直接对于每个区间暴力扫一遍就好了嘛。
初次提交 AC。
笨笨的电话网络
二分答案+最短路
【问题描述】
多年以后,笨笨长大了,成为了电话线布置师。由于地震使得某市的电话线全部损坏,笨笨是负责将电话线接到该市的负责人。
该市周围分布着 N(1≤N≤1000)根按 1..N 顺次编号的废弃的电话线杆,任意两根电话线杆间都没有电话线相连。一共 P(1≤P≤10000)对电话线杆间可以拉电话线,其余的由于地震使得无法被连接。第 i 对电话线杆的两个端点分别为 Ai,Bi,它们间的距离为 Li(1≤Li≤1000000)。数据保证每对(Ai,Bi)最多只出现 1 次。编号为 1 的电话线杆已经接入了全国的电话网络,整个市的电话线全都连到了编号为 N 的电话线杆上。也就是说,笨笨的任务仅仅是找一条将 1 号和 N 号电话线杆连起来的路径,其余电话线杆并不一定要连入电话网络。
电信公司决定支援灾区免费为该市连接 K(0≤K≤N)对由笨笨指定的电话线杆。对于此外的那些电话线,需要为它们付费,总费用等于其中最长的电话线的长度(每根电话线仅连接一对电话线杆)。
如果需要连接的电话线杆不超过 K 对,那么总支出为 0。
笨笨需要计算一下,将电话线引到震中市最少需要在电话线上花多少钱?
【输入】
输入文件的第一行包含三个用空格隔开的整数:N,P 和 K。
第二行到第 P+1 行:每行分别都为三个用空格隔开的整数:Ai,Bi 和 Li。
【输出】
输出文件中仅包含一个整数,表示在这项工程上的最小支出。如果任务不可能完成,则输出-1。
【输入样例】
5 7 1
1 2 5
3 1 4
2 4 8
3 2 3
5 2 9
3 4 7
4 5 6
【输出样例】
4
【解题过程】
首先很明显免费的 K 条肯定是路径中最大的 K 条,所以要二分枚举最终选择的路径中按边权从大到小排序后的第 K+1 条边的权值是多少,这个权值就是最后的费用。二分出来之后,我一开始用了 DFS 判断解的正确性,O(N!) 不靠谱。然后又想了一会儿,想到可以用最短路验证,具体来说就是二分枚举出一个边权 mid 后,把图中权值大于 mid 的边设为 1,权值小于 mid 的边设为 1,然后从 1 到 N 做最短路,求出的最短路如果 <= K,那么这个解就可行,继续二分。
初次提交 10 分左右,原因是一开始是枚举权值,后面改成了在边集数组中枚举,但是忘了改相应的函数参数等等。
09day1的更多相关文章
- 二模09day1解题报告
T1.词编码(word) 给出一些原长为n的01串经过变化后的串求原串.原串的特点是:各个1的位置号和%(n+1)==0 变法(只取其一): 改一个0为1 删一个 加一个 不变. 其中2优先考虑位置靠 ...
随机推荐
- Android内存泄漏问题(一)
前言 不少人认为JAVA程序,因为有垃圾回收机制,应该没有内存泄露. 其实如果我们一个程序中,已经不再使用某个对象,但是因为仍然有引用指向它,垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用, ...
- JAVA IO 类库详解
JAVA IO类库详解 一.InputStream类 1.表示字节输入流的所有类的超类,是一个抽象类. 2.类的方法 方法 参数 功能详述 InputStream 构造方法 available 如果用 ...
- UVA 1362 Exploring Pyramids 区间DP
Archaeologists have discovered a new set of hidden caves in one of the Egyptian pyramids. The decryp ...
- UVA 10673 扩展欧几里得
题意:给出x 和k,求解p和q使得等式x = p[x / k] + q [ x / k], 两个[x / k]分别为向下取整和向上取整 题解:扩展欧几里得 //meek///#include<b ...
- UVALive 6187 Never Wait for Weights 带权并查集
题意:每次给出每两个数之间的大小差值.在给出关系的过程中插入询问:数a和数b的差值,若不能确定,输出UNKNOWN 解法:相对大小关系的处理:并查集 1.给出两点的相对大小关系后,找到两个点的根节点, ...
- IP TCP HTTP Socket的区别
网络由下往上分为 物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层, 三者从本质上来说没有可 ...
- JS中基本类型与包装类型的关系
对于JS中一些类型的转化的东西,自己测试并得出的结论,有错误的地方请大大们留言. 不多废话,直接贴代码,测试请直接拷贝全部代码: <!DOCTYPE html> <html> ...
- 算法导论:Trie字典树
1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tr ...
- iOS开发多线程--技术方案
pthread 实现多线程操作 代码实现: void * run(void *param) { for (NSInteger i = 0; i < 1000; i++) { ...
- Visual studio C#语言输出调试信息到Output窗口方法
1.菜单栏: 工具>选项>调试>将所有输出窗口文本重定向到即时窗口 2.使用Console.WriteLine或Write添加调试信息 3.按F5启动调试程序 4. ...