问题 A: 导弹拦截
时间限制: 1 Sec 内存限制: 128 MB
题目描述
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意 的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所 有的导弹。
输入导弹一次飞来的高度(雷达给出的高度不大于30000的正整数)。计算这套系统最多能拦截多少导弹。
输入
n颗依次飞来的导弹高度,导弹颗数<=1000。
输出
一套系统最多拦截的导弹数。
样例输入
7
300 250 275 252 200 138 245
样例输出
5
提示
这题是一道裸的LIS,
f(n)表示1~n内最多拦截的导弹数。
有:f(n)=Max(f[i]+1)(i<n && a[i]>=a[j])
f值相等的我们只用保留a值最小的,再二分查找即可。
问题 B: 友好城市
时间限制: 1 Sec 内存限制: 128 MB
题目描述
Palmia国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置不同的N个城市。北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。
每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故。编程帮助政府作出一些批准和拒绝申请的决定,使得在保证任意两条航线不相交的情况下,被批准的申请尽量多。
输入
第1行,一个整数N(1<=N<=50000,表示城市数。
第2行到第n+1行,每行两个整数,中间用1个空格隔开,分别表示南岸和北岸的一对友好城市的左边。(0<=xi<=10000)
输出
仅一行,输出一个整数,政府所能批准的最多申请书。
样例输入
7
22 4
2 6
10 3
15 12
9 8
17 17
4 2
样例输出
4
提示
题目中说不能相交,所以可以先将一维排序,在比较另一维,
然后我们就见到了熟悉的东西——LIS.
问题 C: 0/1背包
时间限制: 1 Sec 内存限制: 128 MB
题目描述
一个旅行者有一个最多能装m公斤物品的背包,现在有n件物品,它们的重量分别是w1,w2,…,wn,它们的价值分别为c1,c2,…,cn。若每件物品只有一件,求旅行者能获得的最大总价值。
输入
第一行:两个整数,m(背包容量,m<=200)和n(物品数量,n<=30)。
第二~n+1行:每行两个整数wi,ci,表示每个物品的重量和价值。
输出
一个数据,表示最大总价值。
样例输入
10 4
2 1
3 3
4 5
7 9
样例输出
12
提示
只是最初始的背包问题。
f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。
f[i][v]=max(f[i-1][v],f[i-1][v-Ci]+Wi);
而每次主循环中以v的递减顺序计算 f[v],这样才
能保证计算f[v]时f[v-Ci]保存的是状态f[i-1][v-Ci]的值。