冲刺NOIP!

来源:互联网 发布:数据库原理 王珊 pdf 编辑:程序博客网 时间:2024/04/29 02:57

今天一过,后天就要动身去成都参加NOIP了。时间过得好快

今天花了一天整理了二十多道题,都是重要算法,也配合了例题,想要的可以下载(有测试数据,cena已配置好)

http://download.csdn.net/detail/jiangzh7/4745790



算法大纲

模拟

动态规划

    走楼梯

    装箱问题

    01背包

    完全背包

    尼克的任务

    区间动规

    记忆化

    最长上升子序列N2

    最长上升子序列Nlog2N

    贪心思想

    最长相同子序列

    最大子序列和

    最大子矩阵和

    最大子立方体和

    ...

搜索

    宽搜

    深搜(回溯法)

    遍历染色

图论

    最短路

       dijkstra

       堆优dijkstra

       spfa

       floyd

    最小生成树

       prim

       kruskal(并查集优化)

    最小环

       floyd

       搜索剪枝

二分

拓扑排序

字符串操作

并查集


 

动态规划 ——走楼梯(走楼梯.pas/c/cpp/in/out)

Description:

走楼梯每一步可以走1步,2步或3步

给出一个n(n<=20),输出从阶梯1到阶梯n的方案总数

Inpur:

5

Ouput:

13

 

动态规划 ——装箱问题(装箱问题.pas/c/cpp/in/out)

题目描述:

有一个箱子容量为v(正整数,0<=v<=100),同时有n个物品(0<n<=20),每一个物品有一个体积(正整数)。

要求从n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。

 

输入格式:

从文件读入数据。第一行为两个正整数V和N。

第二行共n个数,分别表示这n个物品的体积。

 

输出格式:

输出箱子最小剩余空间。

 

Input

Output

15 6

9 2 2 4 5 8

0

20 4

9 8 4 5

2


动态规划 —— 01背包(01背包.pas/c/cpp/in/out)

题目:开心的金明

题目描述

金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N 元钱就行”。今天一早金明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N 元。于是,他把每件物品规定了一个重要度,分为5 等:用整数1~5 表示,第5 等最重要。他还从因特网上查到了每件物品的价格(都是整数元)。他希望在不超过N 元(可以等于N 元)的前提下,使每件物品的价格与重要度的乘积的总和最大。设第j 件物品的价格为v[j],重要度为w[j],共选中了k 件物品,编号依次为j1...jk,则所求的总和为:v[j1]*w[j1]+..+v[jk]*w[jk]请你帮助金明设计一个满足要求的购物单.

 

输入格式

输入的第1 行,为两个正整数,用一个空格隔开:

N m

(其中N(<30000)表示总钱数,m(<25)为希望购买物品的个数。)

从第2 行到第m+1 行,第j 行给出了编号为j-1

的物品的基本数据,每行有2 个非负整数

v p

(其中v 表示该物品的价格(v≤10000),p 表示该物品的重要度(1~5))

 

输出格式

输出只有一个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的

最大值(<100000000)

 

样例输入

1000 5

800 2

400 5

300 5

400 3

200 2

样例输出

3900


动态规划 ——完全背包(完全背包.pas/c/cpp/in/out)

题目:奖金 rqnoj162

题目描述

在获得吞噬比赛的胜利后,主办方居然只给了M(0<=M<=10000)元,一番咒骂后,你为了庆祝一番,决定用这M元买点东西.现在有N(0<n<=5000)个种类的东西让你挑选,每个东西都有一个价格(0<=W<=M)和一个价值(0<=Q<=20000),每种东西都能挑无数个,现在,你的任务是:当这M元恰好花完时,使所挑选的物品价值总和最大

 

输入格式

第一行二个数N,M

接下来N行每行两个数,分别是价格和价值

 

输出格式

一个数,为当这M元恰好花完时,最大物品价值总和(数据保证存在解)

 

样例输入

5 1000

500 500

100 300

700 800

300 400

200 50

样例输出

3000

 

 

动态规划 ——最长上升子序列N2(最长上升子序列N2.pas/c/cpp/in/out)

输入一个数n(n<=15000),后面接着n个数,求出这n个数中严格上升的最长子序列长度

Input:

5

1 2 3 5 1

Output:

4


动态规划 ——最长上升子序列Nlog2N(最长上升子序列Nlog2N.pas/c/cpp/in/out)

题目同上,算法用二分实现

 

动态规划 ——最长相同子序列(最长相同子序列.pas/c/cpp/in/out)

最长公共子序列tyvj1050

描述 Description

一个字符串A的子串被定义成从A中顺次选出若干个字符构成的串。如A=“cdaad",顺次选1,3,5个字符就构成子串"cad",现给定两个字符串,求它们的最长共公子串。

 

输入格式InputFormat

第一行两个字符串用空格分开。

 

输出格式OutputFormat

最长子串的长度。

 

样例输入SampleInput

abccd aecd

 

样例输出SampleOutput

3

 

数据范围和注释 Hint

两个串的长度均小于2000

 

动态规划 ——最大子序列和(最大子序列和.pas/c/cpp/in/out)

打水漂 rqnoj145

 

题目描述:

君不知,打靶大牛goleenuoer可喜欢打水漂了,他的靶子可以打到河面上的任何一条鱼,可是他的水漂打得实在是烂,无论怎么打那石子只会在河面上跳跃两次就“扑通”了.这天他又来打了.这条宽w米,每隔一米都会有一条鱼,每条鱼都有它的美观值.他想知道如何打才能得到两条鱼之间最大的美观值总和.刚接触OI的他想请您来解答,您能帮助他吗???

 

输入格式

输入文件包含n+1个整数,第一行为一个整数n(n<=10000).从第二行工n个数,第i个整数表示第i条鱼的美观值范(围为-500..500).当所有整数都为负数时输出0.

 

输出格式

输出文件第一行为一个整数表示所得到的两条鱼之间美观值总和.

 

样例输入

6

-2 11 -4 13 -5 -2

样例输出

20

 

动态规划 ——最大子矩阵和(最大子矩阵和.pas/c/cpp/in/out)

最大加权矩形rqnoj106

题目描述

给定一个正整数n( n<=100),然后输入一个N*N矩阵。求矩阵中最大加权矩形,即矩阵的每一个元素都有一权值,权值定义在整数集上。从中找一矩形,矩形大小无限制,是其中包含的所有元素的和最大。矩阵的每个元素属于[-127,127]

 

输入格式

第一行:n,接下来是n行n列的矩阵。

 

输出格式

最大矩形(子矩阵)的和。

 

样例输入

4

0 -2 -7 0

9 2 -6 2

-4 1 -4 1

-1 8 0 -2

样例输出

15


动态规划 ——最大子立方体和(最大子立方体和.pas/c/cpp/in/out)

吃西瓜rqnoj93

题目描述

[说明]此题中出现的所有数全为整数

[背景]SubRaY有一天得到一块西瓜,是长方体形的....

[题目描述]SubRaY发现这块西瓜长m厘米,宽n厘米,高h厘米.他发现如果把这块西瓜平均地分成m*n*h块1立方厘米的小正方体,那么每一小块都会有一个营养值(可能为负,因为西瓜是有可能坏掉的,但是绝对值不超过200).

现在SubRaY决定从这m*n*h立方厘米的西瓜中切出mm*nn*hh立方厘米的一块小西瓜(一定是立方体形,长宽高均为整数),然后吃掉它.他想知道他最多能获得多少营养值.(0<=mm<=m,0<=nn<=n,0<=hh<=h.mm,nn,hh的值由您来决定).

换句话说,我们希望从一个m*n*h的三维矩阵中,找出一个三维子矩阵,这个子矩阵的权和最大.

一个2*3*4的例子,最优方案为切红色2*3*1部分

[数据范围]

对于30%的数据,h=1,1<=m,n<=10

对于全部的数据,1<=h<=32,1<=m,n<=50,保证h<=m,n

 

输入格式

首行三个数h,m,n(注意顺序),分别表示西瓜的高,长,宽.

以下h部分,每部分是一个m*n的矩阵,第i部分第j行的第k个数表示西瓜第i层,第j行第k列的那块1立方厘米的小正方体的营养值.

 

输出格式

SubRaY所能得到的最大营养值

 

样例输入

2 3 4

4 1 2 8

0 5 -48 4

3 0 1 9

2 1 4 9

1 0 1 7

3 1 2 8

样例输出

45


搜索 ——宽搜(宽搜.pas/c/cpp/in/out)

题目:校园迷宫 rqnoj195

题目描述

总算期中考了,鄙人被教育局分配到了SY学校,当然是陪着很多人的。不知转了多少次车,总算到了。可惜的是,SY学校整个像个迷宫一样,就在门口贴了张学校地图。鄙人就开始研究地图了,但是学校错综复杂,等找到目的地,早就开考了。为此,鄙人取出随身携带的微型电脑(不知道从哪来的),向网上发去了求助书。注:只能往4个方向走:上、下、左、右。

输入格式

第1行,二个数,N,M。

接下来是一个N*M的矩阵,表示这个学校。(有N行,M列)。矩阵由2个数字组成。0:路;1:墙。路能走,墙不能走(这是基本常识。不过还是提醒一下,不然哪个牛又要飞檐走壁了)。

再是2行,第1行2个数X1,Y1表示校门口的坐标(即校门口在矩阵的第X1行,第Y1列)。第2行2个数X2,Y2表示鄙人的考场的坐标(即校门口在矩阵的第X2行,第Y2列)。

数据范围:0<M,N<=2000。0〈X1,X2〈=N,0〈Y1,Y2〈=M。

输出格式

一个数,表示最少要走的步数。如果走不到,则输出 No Answer!

样例输入

5 5

1 1 1 1 1

1 1 1 0 0

1 0 0 0 1

0 0 1 0 0

1 1 1 0 1

4 1

5 4

样例输出

6


搜索 ——深搜回溯法(深搜回溯法.pas/c/cpp/in/out)

Color

 

Description

    在机房的生活是如此的寂寞,以至于以will为首的同志们只能够天天上农场种菜来打发时间。

   msh日复一日地种着她的玫瑰,will则毫不疲倦地偷着他的花……尽管天天花被偷掉一半,msh始终没有动摇她种花的决心。原来,一个宏伟计划的蓝图早已埋藏在她的心中。

    众所周知,农场的花一共有4种颜色,msh喜欢不喜欢老旧的东西,所以,她希望每天种花的方案都不一样。特别地,她也觉得两种一样颜色的花种在相邻的位置会很无聊。现在,她想知道,一共有多少种花的方案。

这里要注意的是,农场的种花的位置是不规则的。因此我们给出一对一对的相邻的位置的关系。

Input

第一行两个数N和M,(n<=20)表示种花的位置的个数和相邻的位置的对数

接下来M行,每行一组数A,B表示A,B相邻

Output

一个数表示染色方法数

Sample Input

5 4

1 2

1 3

1 4

1 5

Sample Output

324

 

搜索 ——遍历染色(遍历染色.pas/c/cpp/in/out)

题目:细胞

一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如阵列:

0234500067

1034560500

2045600671

0000000089

有4个细胞。

输入:整数m,n(m行,n列)矩阵(m,n不超过100)

输出:细胞的个数。

样例:

输入:

4  10

0234500067

1034560500

2045600671

0000000089

输出:

4

 

图论 最短路—— dijkstra(dijkstra.pas/c/cpp/in/out)

题目:星门跳跃 rqnoj341

题目描述

在EVE游戏中,宇宙被划分成为许多区域,每个区域中都有数目不定的星门,可以通过星门来跳跃到特定的区域(星门是双向的)。

现在你正参与BBE联军与MLGBD联盟的会战,但由于飞船受损,需要尽快回到后方的友军空间站进行维护。

试编写程序,计算出所须的最短的返回空间站时间。

为了简化问题,我们约定飞船所在的位置为区域1,空间站所在的位置为区域N。

 

问题规模:

对于100%的数据,1<N<=10000,1<M<20000,1<=X[],Y[]<=N,1<=Z[]<=100;

输入格式

第1行,两个整数N,M,分别为区域的总数和星门的总数;

第2..M+1行,每行三个整数X[i],Y[i],Z[i],分别为星门连接的两个区域,以及跳跃所需时间;可能有重边!

输出格式

一个整数,返回空间站所需的最短时间。无法返回输出’NO’

样例输入

5 3

1 4 5

4 5 1

1 2 7

样例输出

6


图论 最短路—— 堆优dijkstra(堆优dijkstra.pas/c/cpp/in/out)

题目同上,算法不同


图论 最短路—— spfa(spfa.pas/c/cpp/in/out)

题目同上,算法不同

 

图论 最短路—— floyd(floyd.pas/c/cpp/in/out)

题目同上,算法不同,数据范围改为1<N<=100,1<M<200

 

图论 ——Prim(prim.pas/c/cpp/in/out)

题目描述

学校某日突发奇想,要造个小公园。但是,公园造造简单,最麻烦的就是路了。学校张榜:谁设计一个方案,材料费最小,那么,他就获得1000奖学金。鄙人想去,但是作业铺天盖地,根本没时间啊。只好到网上来求助……
各路英雄,帮帮忙吧。

输入格式

第1行,二个数,N,M。N表示公园有N个景点,M表示规划的可以造路的路的条数
接下来M行,每行3个数:X,Y,A。表示第X个景点和第Y个景点之间可以造路,材料费为A。(第X个景点和第Y个景点之间可以造路,也就是说第Y个景点和第X个景点之间也可以造路)。
当然,不会出现孤立的景点。
数据范围:0 <N<=100,0<M<=10000,0 <X,Y<=N,0 <A<32768。

输出格式

一个数,表示最少的材料费。

样例输入

8 13

1 7 1

1 2 9

1 6 9

2 8 2

2 3 9

3 8 3

3 4 9

4 8 4

4 5 9

5 7 5

5 6 9

6 7 6

7 8 7

样例输出

28


图论 最小生成树—— kruskal(kruskal.pas/c/cpp/in/out)

题目同上,算法不同


图论 最小环—— floyd最小环(floyd最小环.pas/c/cpp/in/out)

心灵的抚慰

背景 Background

病毒问题解决后,神牛们的心灵久久不能平静。有个神牛因此已经“乱了”。他脑子中满是程序(否则怎么会成为神牛呢),而且他可以从一个程序联想到一些相似的程序。比如从程序1联想到2,从2联想到4,从4联想到6,从6联想到9……躺就像搜索一样一步一步越陷越深。不过同一种联想他只会联想一次。比如1、2之间他进行了一次联想,那么他不会再重新联想1到2,或2到1。眼看他又要乱了,有人突然想到,如果他刚开始时想到的程序能够经过联想若干次后联想回到原程序,那不就乱回来了吗?由于神牛马上就要开乱,请在1秒内告诉他,他需要想哪个程序,以便乱回来。

 

题目描述Description

给出一些程序和他们互相联想的关系(如果两个程序A、B有联系,神牛可以从A联想到B,也可以从B联想到A,但A、B之间神牛最多联想一次),请告诉神牛他需要想哪个程序,以便在最短的时间内乱回来,并输出这个最短时间。

 

输入格式 InputFormat (heart.in)

第一行有两个正整数N,M,分别表示程序个数和有多少对程序可以被神牛直接互相联想。

以下M行,每行三个正整数,分别表示一种联想的两端的程序的编号(从1开始),以及进行这种联想所需要的最短时间。

 

输出格式 OutputFormat (heart.out)

如果神牛无论如何都再也乱不回来了,输出“He will never come back.”。

如果神牛能够乱回来,请输出神牛会乱多长时间。

 

样例输入 InputExample

4 3

1 2 10

1 3 20

1 4 30

 

样例输出 OutputExample

He will never come back.

 

数据范围

对于100% 的数据,n≤250。


二分(二分.pas/c/cpp/in/out)

【NOIP提高:1】2011_聪明的质检员

 

Description

小T是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有 n 个矿石,从 1~n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi 。检验矿产的流程是:

1 、给定m 个区间[Li,Ri];

2 、选出一个参数 W;

3 、对于一个区间[Li,Ri],计算矿石在这个区间上的检验值Yi:

Yi=Σ1*Σvj,Σ的循环变量为j,这里j要满足j∈[Li,Ri]且wj≥W,这里j是矿石编号。

这批矿产的检验结果Y为各个区间的检验值之和。ΣYi,Σ的循环变量为i,1≤i≤m。

若这批矿产的检验结果与所给标准值S 相差太多,就需要再去检验另一批矿产。小T不想费时间去检验另一批矿产,所以他想通过调整参数W 的值,让检验结果尽可能的靠近标准值S,即使得S-Y 的绝对值最小。请你帮忙求出这个最小值。

 

Input

第一行包含三个整数n ,m,S,分别表示矿石的个数、区间的个数和标准值。 接下来的n 行,每行 2 个整数,中间用空格隔开,第i+1行表示 i 号矿石的重量 wi 和价值vi 。

接下来的m 行,表示区间,每行2 个整数,中间用空格隔开,第i+n+1 行表示区间[Li,Ri]的两个端点 Li和Ri 。注意:不同区间可能重合或相互重叠。

Output

输出只有一行,包含一个整数,表示所求的最小值。

 

Sample Input

5 3 15

1 5

2 5

3 5

4 5

5 5

1 5

2 4

3 3

Sample Output

10

 

Hint

【样例说明】

对样例的解释

当W=4的时候,三个区间上检验值分别为 20、5 、0 ,这批矿产的检验结果为 25,此时与标准值S 相差最小为10。

【数据范围】

对于10% 的数据,有1≤n,m≤10;

对于30% 的数据,有1≤n,m≤500 ;

对于50% 的数据,有1≤n,m≤5,000;

对于70% 的数据,有1≤n,m≤10,000 ;

对于100%的数据,有1≤n,m≤200,000,0<wi,vi≤10^6,0<S≤10^12,1≤Li≤Ri≤n 。

 

并查集(并查集.pas/c/cpp/in/out)

亲戚

若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。

规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。

 

数据输入:

第一行:三个整数n,m,p,(n<=5000,m<=5000,p<=5000),分别表示有n个人,m个亲戚关系,询问p对亲戚关系。

以下m行:每行两个数Mi,Mj,1<=Mi,Mj<=N,表示Ai和Bi具有亲戚关系。

接下来p行:每行两个数Pi,Pj,询问Pi和Pj是否具有亲戚关系。

 

数据输出:

P行,每行一个’Yes’或’No’。表示第i个询问的答案为“具有”或“不具有”亲戚关系。

 

样例:

       input.txt

6 5 3

1 2

1 5

3 4

5 2

1 3

1 4

2 3

5 6

output.txt

Yes

Yes

No


原创粉丝点击