一大堆算法题。
[TOC]
1. 贪心法
1.1 快乐司机
题目描述
“嘟嘟嘟嘟嘟嘟
喇叭响 我是汽车小司机 我是小司机 我为祖国运输忙 运输忙”
这是儿歌“快乐的小司机”。话说现在当司机光有红心不行,还要多拉快跑。多拉不是超载,是要让所载货物价值最大,特别是在当前油价日新月异的时候。司机所拉货物为散货,如大米、面粉、沙石、泥土……
现在知道了汽车核载重量为w
,可供选择的物品的数量n
。每个物品的重量为gi
,价值为pi
。求汽车可装载的最大价值。
输入格式
输入第一行为由空格分开的两个整数 n
w
第二行到第n+1
行,每行有两个整数,由空格分开,分别表示gi
和pi
输出格式
最大价值(保留一位小数)
样例
样例输入
1 | 5 36 |
样例输出
1 | 71.3 |
数据范围与提示
解释:
- 先装第5号物品,得价值35,占用重量7
- 再装第4号物品,得价值36.346,占用重量29
- 最后保留一位小数,得71.3
范围
(n<10000,w<10000,0<gi<=100,0<=pi<=100)
代码
1 |
|
1.2 活动安排
输入格式
第一行一个整数 nn;
接下来的 nn 行,每行两个整数 s_is**i 和 f_if**i。
输出格式
输出互相兼容的最大活动个数。
样例
输入样例 1
1 | 4 |
输出样例 1
1 | 2 |
数据范围与提示
1≤n≤1000
代码
1 |
|
1.3 分发饼干
题目描述
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
输入格式
第一行两个数,分别表示孩子个数和饼干块数 第二行输入各孩子的胃口值 第三行输入饼干的尺寸
输出格式
被满足的孩子的个数
样例
样例输入 1
1 | 3 2 |
样例输出 1
1 | 1 |
样例输入 2
1 | 4 4 |
样例输出 2
1 | 2 |
数据范围与提示
1 <= g.length <= 3 * 104 0 <= s.length <= 3 * 104 1 <= g[i], s[j] <= 231 - 1
代码
1 |
|
2. 蛮力法
2.1 狱卒问题
题目描述
某王国对囚犯进行大赦,让一狱吏n次通过一排锁着的n间牢房,每通过一次按所定规则转动门锁,每转动一次,原来锁着的被打开,原来打开的被锁上;通过n次后,门锁开着的,牢房中的犯人放出,否则犯人不得获释.转动门锁的规则是这样的,第一次通过牢房,要转动每一把门锁,即把全部锁打开;第二次通过牢房时,从第二间开始转动,每隔一间转动一次;第k次通过牢房,从第k间开始转动,每隔k-1 间转动一次;问通过n次后,那些牢房的锁仍然是打开的?
输入格式
一行一个整数n
输出格式
用空格隔开每个数字
样例
输入样例1
1 | 5 |
输出样例1
1 | 1 4 |
输入样例2
1 | 30 |
输出样例2
1 | 1 4 9 16 25 |
数据范围与提示
n<=1000
代码
1 |
|
2.2 四平方和
题目描述
四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和。如果把0包括进去,就正好可以表示为4个数的平方和。
比如:5 = 0^2 + 0^2 + 1^2 + 2^25=02+02+12+22,7 = 1^2 + 1^2 + 1^2 + 2^27=12+12+12+22
对于一个给定的正整数,可能存在多种平方和的表示法。要求你对4个数排序:0 <= a <= b <= c <= d。并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法
输入格式
一个正整数N (N<5000000)
输出格式
4个非负整数,按从小到大排序,中间用空格分开
样例
样例输入 1
1 | 5 |
样例输出 1
1 | 0 0 1 2 |
样例输入 2
1 | 12 |
样例输出 2
1 | 0 2 2 2 |
样例输入 3
1 | 773535 |
样例输出 3
1 | 1 1 267 838 |
代码
1 |
|
2.3 求n以内的所有素数
输入格式
一行,输入一个数n
输出格式
分行输出n以内的所有素数
样例
输入样例
1 | 6 |
输出样例
1 | 2 |
代码
1 |
|
2.4 找零问题
题目描述
有n个人正在饭堂排队买海北鸡饭。每份海北鸡饭要25元。奇怪的是,每个人手里只有一张钞票(每张钞票的面值为25、50、100元),而且饭堂阿姨一开始没有任何零钱。请问饭堂阿姨能否给所有人找零(假设饭堂阿姨足够聪明),n不超过1000000
输入格式
第一行一个整数n,表示排队的人数。
接下来n个整数a[1],a[2],…,a[n]。a[i]表示第i位学生手里钞票的价值(i越小,在队伍里越靠前)
输出格式
输出YES或者NO
样例
样例输入1
1 | 4 |
样例输出1
1 | YES |
样例输入2
1 | 2 |
样例输出2
1 | NO |
样例输入3
1 | 4 |
样例输出3
1 | YES |
代码
1 |
|
2.5 最长公共子串
题目描述
这是一道模板题。
给定 nn 个字符串,试求出这些字符串的最长公共子串。
输入格式
第一行一个整数 nn。
下面第 22 到 n+1n+1 行,每行一个字符串。
输出格式
仅一行,包含一个正整数,表示 nn 个字符串的最长公共子串长度。
样例
输入样例 1
1 | 2 |
输出样例 1
1 | 2 |
数据范围与提示
对于第 ii 个测试点,保证 n,=,i+1n=i+1。
对于每一个字符串,保证 |str|,\le,10^{\lceil \frac{i}{3}\rceil}∣str∣≤10⌈3i⌉,出现字符均为小写英文字母。
代码
1 |
|
3. 分治法
3.1 最大子段和
题目描述
给出一个长度为n的整数列a,选出其中连续且非空的一段使得这段和最大。
输入格式
第一行是一个整数,表示序列的长度n; 第二行有n个整数,第i个整数表示序列的第i个数字a_ia**i
输出格式
输出一行一个整数表示答案:最大子段和的值。
样例
样例输入
1 | 6 |
样例输出
1 | 20 |
数据范围与提示
n<=100
代码
1 |
|
3.2 股票买卖算法
题目描述
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
输入格式
一个数字,表示总天数 一行数字,表示某几天购入该股票的价格
输出格式
一个数字,表示能获取的最大利润
样例
输入样例 1
1 | 6 |
输出样例 1
1 | 5 |
代码
1 |
|
3.3 二分查找
题目描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。
输入格式
两行。第一行输入两个整数n,kn,k,nn表示数组的长度,kk表示要查找的目标值;第二行输入一个长度为nn的有序数组。
输出格式
一行,输出kk的索引,如果没有找到kk,则输出-1−1。
样例
样例输入 1
1 | 10 6 |
样例输出 1
1 | 5 |
样例输入 2
1 | 4 5 |
样例输出 2
1 | 2 |
代码
1 |
|
3.4 二分查找进阶
题目描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
输入格式
两行。第一行输入两个整数n,kn,k,nn表示数组的长度,kk表示要查找的目标值;第二行输入一个长度为nn的有序数组。
输出格式
一行,输出kk的索引,如果没有找到kk,则输出返回它将会被按顺序插入的位置。
样例
样例输入 1
1 | 4 5 |
样例输出 1
1 | 2 |
样例输入 2
1 | 4 2 |
样例输出 2
1 | 1 |
代码
1 |
|
3.5 二分查找数组元素
题目描述
用递归函数实现二分法查找数组元素。 补充:要求给定数组采用如下代码定义 int data[200]; for (i=0; i<200; i++) data[i]=4*i+6;
输入格式
输入一个待查找的整数(该整数一定在数组data中)
输出格式
该整数在数组中的指标
样例
样例输入 1
1 | 262 |
样例输出 1
1 | 64 |
样例输入 2
1 | 438 |
样例输出 2
1 | 108 |
样例输入 3
1 | 774 |
样例输出 3
1 | 192 |
数据范围与提示
输入数据中每一个数的范围。 输入数据必须满足4*i+6,i=0,1,2,3,…,198,199
代码
1 |
|
3.6 高精度乘法
题目描述
给定两个正整数A和B,请你计算A * B的值。
输入格式
共两行,第一行包含整数A,第二行包含整数B。
输出格式
共一行,包含A * B的值。
样例
输入格式
1 | 4 |
输出格式
1 | 2 |
数据范围与提示
1≤A的长度≤100000, 0≤B≤10000
代码
1 |
|
3.7 棋盘覆盖问题
题目描述
在一个2^k \times 2^k2k×2k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型3格板覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型3格板不得重叠覆盖。求解覆盖方案。
当k=2;特殊方格位于第0行,第1列的一种求解方案。
输入格式
输入三个整数例如: 2 0 1 分别代表k值,特殊方格所在行,特殊方格所在列
输出格式
模拟棋盘的二维数组每一位元素,每个元素占3个字符位置。 例如printf(“%3d”,board[i][j]);
样例
样例输入
1 | 2 0 1 |
样例输出
1 | 2 0 3 3 |
代码
1 |
|
3.8 快速排序
题目描述
给你一个整数数组nums,请你将该数组升序排列(要求使用快速排序)。
输入格式
第一行输入数组元素个数
第二行输入各数组元素
输出格式
排序后的数组
样例
输入样例 1
1 | 4 |
输出样例 1
1 | 1 2 3 5 |
输入样例 2
1 | 6 |
输出样例 2
1 | 0 0 1 1 2 5 |
代码
1 |
|
3.9 归并排序
题目描述
给你一个整数数组nums,请你将该数组升序排列
输入格式
一个整数,表示数组元素个数
一行整数,表示整数数组中各元素
输出格式
一行整数,表示排序后的数组元素
样例
输入样例 1
1 | 4 |
输出样例 1
1 | 1 2 3 5 |
输入样例 2
1 | 6 |
输出样例 2
1 | 0 0 1 1 2 5 |
代码
1 |
|
4. 动态规划
4.1 爬楼梯
题目描述
假设你正爬楼梯,需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?
输入格式
输入:2
输出格式
输出:2
样例
输入样例 1
1 | 2 |
输出样例 1
1 | 2 |
代码
1 |
|
4.2 零钱兑换
题目描述
给你一个整数数组coins,表示不同面额的硬币;以及一个整数amount,表示总金额。计算并返回可以凑成总金额所需的最少硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。你可以认为每种硬币的数量是无限的。
输入格式
输入:coins={1,2,5},amount=11
输出格式
输出:3 解释:11=5+5+1
样例
输入样例 1
1 | 1 2 5 |
输出样例 1
1 | 3 |
输入样例 2
1 | 2 |
输出样例 2
1 | -1 |
输入样例 3
1 | 1 |
输出样例 3
1 | 0 |
代码
1 |
|
4.3 最长公共子序列
题目描述
给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。 例如,”ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。 两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。
输入格式
输入:text1 = “abcde”, text2 = “ace”
输出格式
输出:3
样例
输入样例 1
1 | abcde |
输出样例 1
1 | 3 |
代码
1 |
|
4.4 石子游戏
题目描述
亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] 。 游戏以谁手中的石子最多来决出胜负。石子的总数是奇数,所以没有平局。 亚历克斯和李轮流进行,亚历克斯先开始。 每回合,玩家从行的开始或结束处取走整堆石头。 这种情况一直持续到没有更多的石子堆为止,此时手中石子最多的玩家获胜。 假设亚历克斯和李都发挥出最佳水平,当亚历克斯赢得比赛时返回 true ,当李赢得比赛时返回 false 。
输入格式
输入:5 3 4 5
输出格式
true
样例
输入样例 1
1 | 5 3 4 5 |
输出样例 1
1 | true |
代码
1 |
|
4.5 整数拆分
题目描述
给定一个正整数n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。返回你可以获得的最大乘积。
输入格式
输入:2
输出格式
输出:1
样例
输入样例 1
1 | 10 |
输出样例 1
1 | 36 |
代码
1 |
|
5. 回溯法
5.1 N皇后问题
题目描述
在一张N * NN∗N的国际象棋棋盘上,放置NN个皇后,使得所有皇后都无法互相直接攻击得到,(皇后可以直接攻击到她所在的横行,数列,斜方向上的棋子),现在输入一个整数NN,表示在NNN∗N的棋盘上放NN*个皇后,请输出共有多少种使得所有皇后都无法互相直接攻击得到的方案数。 例如下面这样的摆法,是4皇后的一个解 (1代表有皇后,0代表没有)
1 | 0 1 0 0 |
输入格式
一个整数NN
输出格式
能使得在NNN∗N的国际象棋棋盘上放置NN*个皇后,并且所有皇后都无法互相直接攻击得到的方案数
样例
样例输入1
1 | 4 |
样例输出1
1 | 2 |
样例输入2
1 | 8 |
样例输出2
1 | 92 |
数据范围与提示
1<=N<=13
代码
1 |
|
5.2 01背包问题
题目描述
给定n种物品和一背包。物品i的重量是wi>0,其价值为vi>0,背包的容量为c。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? (要求使用回溯法)
输入格式
第一行输入物品数量和背包容量 第二行输入所有物品重量 第三行输入所有物品价值
输出格式
第一行输出最大价值 第二输出放置方案
样例
输入样例 1
1 | 4 6 |
输出样例 1
1 | 8 |
代码
1 |
|
5.3 砝码称重
题目描述
小明捡到了一架没有游标的天平和N个标有重量的砝码,于是他想知道他能够称出多少种不同的重量(假设只能将砝码放在一侧)。
输入格式
输入的第一行包含一个正整数N,表示有N个砝码。接下来一行有N个正整数,表示N个砝码的重量。
输出格式
输出一行,包含一个整数,表示能够称出多少种不同的重量。
数据规模和约定
N<16,砝码重量<=1000
样例
输入样例 1
1 | 3 |
输出样例 1
1 | 6 |
代码
1 |
|
5.4 方格填数
题目描述
如下的10个格子,填入0~9的数字。要求:连续的两个数组不能相邻。(左右、上下、对角都算相邻),一共有多少种可能的填数方案?
输入格式
无输入
输出格式
一个整数
代码
1 |
|
5.5 简单装载问题
题目描述
有n个集装箱要装上一艘载重量为W的轮船,其中集装箱i(1≤i≤n)的重量为Wi。
不考虑集装箱的体积限制,现要从这些集装箱中选出重量和小于等于W并且尽可能大的若干装上轮船。例如,n=5,W=10,w={5,2,6,4,3}时,其最佳装载方案是(1,1,0,0,1)或者(0,0,1,1,0),即装载的集装箱重量和达到最大值10。采用回溯法求解。
输入格式
第一行输入集装箱个数n和轮船的载重量
第二行输入集装箱的重量
输出格式
输出所有的可行方案,每个方案单独占一行
样例
输入样例 1
1 | 5 10 |
输出样例 1
1 | 1 1 0 0 1 |
代码
1 |
|
5.6 求解子集和问题
题目描述
给定n个不同的正整数集合w={w1, w2,…….wn} 和一个正整数W,要求找出w的子集s,使该子集中所有元素的和为W。例如,当n=4时,w={11,13,24,7},W=31,则满足要求的子集为(11,13,7)和(24,7)。
输入格式
第一行输入n的个数和子集和W的值
第二行分别输入n个元素的值
输出格式
按行输出每个解
样例
输入样例 1
1 | 4 31 |
输出样例 1
1 | 11 13 7 |
代码
1 |
|
5.7 全排列问题
题目描述
输出自然数 1 到 n所有不重复的排列,即 n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入格式
第一行为一个整数n
输出格式
由1至n组成的所有不重复的数字序列,每行一个序列。每个数字之间由空格隔开
样例
输入样例 1
1 | 3 |
输出样例 1
1 | 1 2 3 |
代码
1 |
|
作者: Lee