![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
王道机试指南第二版
王道机试指南中的好题
白给、少年
404 NOT FOUND
展开
-
【贪心】神枪手问题
【题目大意】薛是一个神枪手,突然有一天遇到了一群怪物。薛带着 n 支枪,每支枪的攻击力为 a[i] 。每个怪物的防御力为 b[j] 。在满足b[j]<=a[i] 的情况下,薛可用 i 枪杀死怪物 j ,他会得到 a[i]-b[j] 的奖金。请记住:每支枪只能用来杀死一个怪物,而且显然每个怪物只能被杀死一次。薛想最大化他的奖金,并无要杀死所有怪物的必要。【输入】第一行:T,代表有多少组测试数据第二行: n (枪支数量),m(怪兽数量)第三行:n 个枪支的攻击力..原创 2021-01-30 17:13:49 · 431 阅读 · 0 评论 -
加油站问题【贪心】
题目描述有了高速公路,开车从杭州到任何其他城市都很容易。但由于汽车的油箱容量有限,我们必须不时地在路上找到加油站。不同的加油站可能会给出不同的价格。你被要求仔细设计最便宜的路线去。输入描述:对于每个测试实例第一行包含4个正数:Cmax(<=100),即油箱的最大容量;D(<=30000),即杭州到目的地城市的距离;Davg(<=20),即汽车每单位汽油可行驶的平均距离;N(<=500),即加油站总数。接下来是N行,每行包含一对非负数:Pi,煤气单价,Di(&.原创 2021-01-31 17:32:33 · 1160 阅读 · 1 评论 -
【区间贪心】合理安排电视节目
【题目】假设你已经知道了所有你喜欢看的电视节目的转播时间表,为了能看尽量多的完整节目,你会合理安排吗?【输入】输入数据包含多个测试实例。第一行只有一个整数 n(n<=100),表示你喜欢看的节目的总数。n=0时表示输入结束,不做处理。然后是 n 行数据,每行包括两个数据 Tis 和 Tie(1<=i<=n),分别表示开始和结束时间。【样例输入】12 1 33 40 73 815 1915 2010 158 186 125 104 1.原创 2021-01-31 16:05:01 · 750 阅读 · 0 评论 -
【贪心】代理服务器
题目描述 使用代理服务器能够在一定程度上隐藏客户端信息,从而保护用户在互联网上的隐私。我们知道n个代理服务器的IP地址,现在要用它们去访问m个服务器。这 m 个服务器的 IP 地址和访问顺序也已经给出。系统在同一时刻只能使用一个代理服务器,并要求不能用代理服务器去访问和它 IP地址相同的服务器(不然客户端信息很有可能就会被泄露)。在这样的条件下,找到一种使用代理服务器的方案,使得代理服务器切换的次数尽可能得少。输入描述: 每个测试数据包括 n + m + 2 行。 第 1 ...原创 2021-01-31 15:06:55 · 186 阅读 · 0 评论 -
【区间贪心】岛屿之间架桥梁(非常难)
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int MAX=200001;struct Island{ long long left; long long right;};struct Bridge{ long long leng.原创 2021-01-31 16:45:18 · 212 阅读 · 0 评论 -
【贪心】FatMouse‘s Trade
【题目】老鼠准备了 M 磅猫粮,并且准备拿这些猫粮和仓库的猫交换咖啡豆。仓库有 N 个房间(都有咖啡豆)。在第i个房间内有 J[i] 磅咖啡豆,但相应地需要付出 F[i] 磅的猫粮才能进行兑换。但是,老鼠不一定要兑换该房间内全部的咖啡豆;相反,如果老鼠支付 a%*F[i] 的猫粮,那么可以获得 a%*J[i] 的咖啡豆。现在请你计算 M 磅猫粮最多可以获得多少咖啡豆。【输入】输入数据有多组。每组数据包括第一行:M N,接下来是N行,每行包含两个非负整数 J[i] F[i]。最后一组数据.原创 2021-01-30 16:28:03 · 1123 阅读 · 1 评论 -
【贪心】鸡兔同笼
题目描述一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至多有多少只动物。输入描述:每组测试数据占1行,每行一个正整数a (a < 32768)输出描述:输出包含n行,每行对应一个输入,包含两个正整数,第一个是最少的动物数,第二个是最多的动物数,两个正整数用一个空格分开如果没有满足要求的答案,则输出两个0。示例1输入2320输出0 05 10思路:不管是兔是鸡,它原创 2021-01-30 15:10:52 · 229 阅读 · 0 评论 -
递归——求二叉树中子树的结点数量
题目描述:已知一个二叉树的最后一个结点为n,现在求结点m所在的子树中一共包括了多少个结点。可以设定一个全局变量num记录结点数,然后用递归方法计算结点的左右子树的结点数。 输入描述:每行包含m,n输出0,0表示结束输出描述:m所在子树的结点数代码:#include<iostream>#include<cstdio>using namespace std;int n;int num=0;int count(int m)...原创 2021-09-14 16:01:31 · 796 阅读 · 0 评论 -
递归——2的幂次方
【题目】:每个正数都可以用指数表示表格。用于例如,137=2^7+2^3+2^0。我们用 a(b) 的形式表示a^b,然后用2(7)+2(3)+2(0)表示137。由于7=2^2+2+2^0和3=2+2^0,137最终由2(2(2)+2+2(0))+2(2+2(0))+2(0)表示。给定一个正数n,你的任务是用只包含数字0和2的指数形式表示n。示例1输入1315输出2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)代码:.原创 2021-02-04 18:09:19 · 264 阅读 · 0 评论 -
递归——全排序【稍难】【多回顾】
题目描述给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列。输入描述:输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。输出描述:输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义:已知S = s1s2...sk , T = t1t2...tk,则原创 2021-02-04 13:26:22 · 167 阅读 · 1 评论 -
递归——杨辉三角
#include<iostream>#include<cstdio>using namespace std;int YH[100][100];int yang(int n,int j){ if(j==1){ YH[1][1]=1; yang(n,++j); } else if(j>1&&j<=n) { for(int i=1;i<=j;i++) .原创 2021-02-04 10:14:34 · 558 阅读 · 0 评论 -
递归——汉诺塔问题
汉诺塔具体题目不再赘述,主要是:A(起始),B(辅助),C(目的)三个柱子,N个圆盘。限制条件:且一次只移动一个圆盘,在小圆盘上不能放大圆盘。其实汉诺塔问题最最重要的地方在于理解三个柱子的角色是时刻在变换的,即什么是否是“目的”,什么时候是“辅助”等等。当N=1时,直接把A中的圆盘移过去C即可;当N=2时,A上面的第一个圆盘(N-1)移到B,把最大(底)的移到C,再把B的一个圆盘移到C即可;当N=3时,①A上面的N-1个圆盘(2个)先移到B; ②再把A...原创 2021-02-03 17:26:36 · 595 阅读 · 0 评论 -
大数运算——高精度乘法
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int main(){ string num1; long long num2; long long n1[1000],result[1000][1000],r[1000]; while(cin>>num1>>num2) { for(int .原创 2021-03-01 12:24:43 · 118 阅读 · 0 评论 -
大整数的因子
题目描述已知正整数k满足2<=k<=9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k.输入描述:若干个非负整数c,c的位数<=30每行一个c输出描述:每一个c的结果占一行1) 若存在满足 c%k == 0 的k,输出所有这样的k,中间用空格隔开,最后一个k后面没有空格。2) 若没有这样的k则输出"none"注意整数溢出问题不要对-1进行计算示例1输入307213-1输出2 3 5 62 3 4 6 8 9原创 2021-01-30 14:48:34 · 301 阅读 · 0 评论 -
数字阶梯求和
题目描述给定a和n,计算a+aa+aaa+a...a(n个a)的和。输入描述:测试数据有多组,输入a,n(1<=a<=9,1<=n<=100)。输出描述:对于每组输入,请输出结果。示例1输入1 10输出1234567900思路:该题与N的阶乘那题较为类似代码:#include<iostream>#include<cstdio>using namespace std;int mai.原创 2021-01-30 11:20:20 · 2276 阅读 · 0 评论 -
N的阶乘【难】
题目描述输入一个正整数N,输出N的阶乘。输入描述:正整数N(0<=N<=1000)输出描述:输入可能包括多组数据,对于每一组输入数据,输出N的阶乘示例1输入4515输出241201307674368000代码:#include<iostream>#include<cstdio>#define width 3000using namespace std;int main(){ int ..原创 2021-01-28 22:44:41 · 138 阅读 · 0 评论 -
进制转换
题目描述将M进制的数X转换为N进制的数输出。输入描述:输入的第一行包括两个整数:M和N(2<=M,N<=36)。下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。输出描述:输出X的N进制表示的数。示例1输入10 211输出1011备注:注意输入时如有字母,则字母为大写,输出时如有字母,则字母为小写。注意:可以先将数从M进制转换为十进制,再从十进制转换为N进制;进制大于10时要用字符来表示原创 2021-01-23 18:13:10 · 106 阅读 · 1 评论 -
十转二转十
题目描述 对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们称B为A的二进制逆序数。 例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。输入描述: 一个1000位(即10^999)以内的十进制数。输出描述: 输入的十进制数的二进制逆序数。示例1输入173输出181代码#include<iostre...原创 2021-01-23 17:46:41 · 107 阅读 · 0 评论 -
十进制转二进制
题目描述将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。输入描述:多组数据,每行为一个长度不超过30位的十进制非负整数。(注意是10进制数字的个数可能有30个,而非30bits的整数)输出描述:每行输出对应的二进制数。示例1输入0138输出01111000注意① 本题输入的数可能多达30多位,因此无法用整型数来保存该题输入,只能用字符串来模拟② 对于取模运算,可以将其转换为对字符串最低数位进行取模运算③ 对于整除运原创 2021-01-23 17:05:58 · 379 阅读 · 0 评论 -
二进制数
题目描述大家都知道,数据在计算机里中存储是以二进制的形式存储的。 有一天,小明学了C语言之后,他想知道一个类型为unsigned int 类型的数字,存储在计算机中的二进制串是什么样子的。 你能帮帮小明吗?并且,小明不想要二进制串中前面的没有意义的0串,即要去掉前导0。输入描述:多行,每一行表示要求的数字输出描述:输出共T行。每行输出求得的二进制串。示例1输入23535262456275989835输出1011110000101111010010原创 2021-01-23 16:35:03 · 134 阅读 · 0 评论 -
矩阵快速幂
前言矩阵的快速幂与数字的快速幂思想相同,唯一不同的地方在于,对于数字的快速幂其初始值为1;而对于矩阵快速幂而言,其初始值是单位矩阵。题目描述给定一个n*n的矩阵,求该矩阵的k次幂,即P^k。输入描述: 第一行:两个整数n(2<=n<=10)、k(1<=k<=5),两个数字之间用一个空格隔开,含义如上所示。接下来有n行,每行n个正整数,其中,第i行第j个整数表示矩阵中第i行第j列的矩阵元素Pij且(0<=Pij<=10)。另外,数据保证..原创 2021-01-28 10:18:57 · 77 阅读 · 0 评论 -
快速幂——求root(N,k)【难】
题目描述 N<k时,root(N,k) = N,否则,root(N,k) = root(N',k)。N'为N的k进制表示的各位数字之和。输入x,y,k,输出root(x^y,k)的值 (这里^为乘方,不是异或),2=<k<=16,0<x,y<2000000000,有一半的测试点里 x^y 会溢出int的范围(>=2000000000)输入描述: 每组测试数据包括一行,x(0<x<2000000000), y(0<y<20...原创 2021-01-27 17:15:43 · 350 阅读 · 0 评论 -
快速幂【难,多回顾】
前言:任何一个数字,不仅可分解为质因数之积,也可以分解为若干2^k之和如: 9 = 1*3*3 = 1+2+4+16 23 =1*23=1+2+4+16 29 =1*29=1+4+8+16其实可以将数字化为二进制,然后二进制位为1的数位代表的权重即是分解结果。例如,29的二进制为11101,则11101=2^0+2^2+2^3+2^4,即1,4,8,16...原创 2021-01-27 15:36:49 · 330 阅读 · 0 评论 -
整除问题【较难!需多回顾复习!】
link:https://www.nowcoder.com/practice/8e29045de1c84d349b43fdb123ab586a?tpId=62&tqId=29462&tPage=1&ru=/kaoyan/retest/2002&qru=/ta/sju-kaoyan/question-ranking题目描述给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。输入描述:两个整数n(2<=n<=1000),a(2&l原创 2021-01-27 10:07:34 · 265 阅读 · 0 评论 -
质因数的个数
链接:https://www.nowcoder.com/questionTerminal/20426b85f7fc4ba8b0844cc04807fbd9?toCommentId=8436179来源:牛客网求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。输入描述:可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。输出描述:对于每组数据,输出N的质因数的个数。示例..原创 2021-01-26 16:55:52 · 144 阅读 · 0 评论 -
素数筛法
题目:利用素数筛法求出2到10000内的所有素数。素数筛法:找到一个素数,就将它的所有倍数均标记为非素数;当遍历到一个数时,若它未被任何小于它的素数标记为非素数,则确定其为素数。步骤如下:从2开始遍历2到10000的所有整数,若当前整数没有因为它是某个小于其的素数的倍数而被标记为非素数,则判定其为素数,并标记它所有的倍数是非素数。然后继续遍历下一个数。遍历完后,所有未被标记成非素数的数是素数。代码:vector<int> prime;//保存质数bool isPrime[原创 2021-01-26 16:12:11 · 128 阅读 · 0 评论 -
素数判定
题目描述给定一个数n,要求判断其是否为素数(0,1,负数都是非素数)。输入描述:测试数据有多组,每组输入一个数n。输出描述:对于每组输入,若是素数则输出yes,否则输入no。示例1输入13输出yes代码:#include<iostream>#include<cstdio>#include<cmath>using namespace std;bool judge(int x){ if(x<2)原创 2021-01-26 15:25:15 · 151 阅读 · 0 评论 -
全排序
题目描述给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列。输入描述:输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。输出描述:输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义:已知S = s1s2...sk , T = t1t2...tk,则原创 2021-02-04 11:32:18 · 66 阅读 · 0 评论 -
sort()排序
int数据类型的sort排序#include<iostream>#include<algorithm>#include<cstring>using namespace std;int main(){ int a[5]={1,3,4,2,5}; sort(a,a+5);//默认升序 for(int i=0;i<5;i++) cout<<a[i]<<' '; retur...原创 2021-02-04 11:09:01 · 107 阅读 · 0 评论 -
最大公约数
若整数g为a,b(不同时为0)的公约数,则g满足 a=g*l,b=g*m,其中l,m为整数。同时,a又可由b表示为a=b*k+r,其中,k为整数,r为a/b的余数。对上面的三个公式进行变形:g*l=g*m*k+r,即r=g*(l-m*k),(g≠0)。由上式可知,a,b的公约数g可以整除r,即(a,b)和(b,r)的公约数是一样的,其最大公约数也必然相等。 因此,把求a,b的最大公约数转化成了求b,a mod b 的最大公约数,问题不变而数据规模明显变小。通过不断重复该过程,直到问...原创 2021-01-26 10:35:44 · 71 阅读 · 0 评论 -
BFS——玛雅人的密码
题目描述玛雅人有一种密码,如果字符串中出现连续的2012四个数字就能解开密码。给一个长度为N的字符串,(2=<N<=13)该字符串中只含有0,1,2三种数字,问这个字符串要移位几次才能解开密码,每次只能移动相邻的两个数字。例如02120经过一次移位,可以得到20120,01220,02210,02102,其中20120符合要求,因此输出为1.如果无论移位多少次都解不开密码,输出-1。输入描述:输入包含多组测试数据,每组测试数据由两行组成。第一行为一个整数N,代表字符串的长度(2&原创 2021-02-06 20:03:41 · 144 阅读 · 0 评论 -
BFS使用总结
1.状态。通过状态的扩展,遍历所有状态。2.状态扩展方式。为了使得先得出的状态能够先扩展,于是使用队列,将得到的状态依次放入队尾,每次取队头元素进行扩展。3.最优。宽度优先搜索常被用来求解最优值问题,因为其搜索到的状态总是按照某个关键字递增,这个特性非常适合求解最优值问题。因此,一旦问题中出现最少,最短,最优等关键字,就要考虑是否是宽度优先搜索问题。...原创 2021-02-06 15:39:06 · 224 阅读 · 0 评论 -
BFS——Find The Multiple
【题目大意】给定正整数n,编写程序找出非零值n的倍数m,并且m的十进制数表示仅包含数字0和1。你可以假设n不大于200,且有不超过100位的相应m。【分析】不要逐个测试n的倍数是否全由0和1组成即可,这样做会花费大量时间,效率低。可以反过来想,只由0和1组成的数相比于整个搜索空间而言是非常少的,可以去搜索由0和1组成的数,然后通过判断这些数能否整除n来求解这个问题。于是,可将由0和1组成的数字num作为一个搜索状态。能由num扩展得到的状态有两个,一个是10*num,另一个是10*mu.原创 2021-02-06 15:31:05 · 123 阅读 · 0 评论 -
BFS——抓住那头牛
【题目大意】农夫被告知逃亡奶牛所在的位置,并希望能立即抓住奶牛。他刚开始站在点N(0<=N<=100000)上,并且母牛站在同一条线上的点K(0<=K<=100000)上。农夫先有步行和传送两者交通方式:1.行走:农夫可以每1分钟从任一点X——>X-1 / X+12.传送:农夫可以每1分钟从任一点X——>2X如果母牛不动,则农夫需要多长时间才能找回它?思路:...原创 2021-02-06 13:39:00 · 428 阅读 · 1 评论 -
DFS——八皇后【小难】【需多回顾】
题目描述会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。 给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。输入描述:每组测试数据占原创 2021-02-07 16:28:26 · 108 阅读 · 0 评论 -
DFS——神奇的口袋
题目描述有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40。John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an。John可以从这些物品中选择一些,如果选出的物体的总体积是40,那么利用这个神奇的口袋,John就可以得到这些物品。现在的问题是,John有多少种不同的选择物品的方式。输入描述:输入的第一行是正整数n (1 <= n <= 20),表示不同的物品的数目。接下来的n行,每行有一个1到40之间的正整数,分别给出a1,原创 2021-02-07 15:33:26 · 123 阅读 · 0 评论 -
DFS——Square
题目大意给出一堆长度各异的木棍,这些木棍能否头尾相连成一个正方形?样例输入34 1 1 1 15 10 20 30 40 508 1 7 2 6 4 4 3 5样例输出yesnoyes思路首先,将木棍长度进行累加,得到总长length;然后将length除以4得到正方形的边长side;之后,将木棍拼凑成长度side的边,拼凑完一条边后,再拼凑下一条,直到拼凑出4条长度为side的边,从而构成一个正方形。搜索状态三元组(sum,number...原创 2021-02-07 11:40:05 · 152 阅读 · 0 评论 -
DFS——骑士的旅途
前言 在深度优先搜索中,对搜索的状态而言,获得一个状态后,同样立即扩展这个状态,但需要保证早得到的状态较后得到扩展,即先入后出特性,可使用栈或递归。 由于深度优先搜索并没有先入先出的特点,所以搜索到需要的状态时,该状态不再具有BFS那样的某种最优的特性。因此,使用DFS常常是为了知道问题是否有解,而不使用DFS求解最优解问题。题目骑士按照“日”字规则行走。骑士的世界就是他生活的8*8棋盘找到一条能够让骑士遍历棋盘上所有点的路径。骑士可以在任何一块方块上开始或结束他的旅...原创 2021-02-06 22:44:19 · 95 阅读 · 0 评论 -
二叉搜索树
题目描述判断两序列是否为同一二叉搜索树序列输入描述:开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。输出描述:如果序列相同则输出YES,否则输出NO示例1输入25674325432675763420原创 2021-02-08 20:54:35 · 60 阅读 · 0 评论 -
二叉排序树
题目描述输入一系列整数,建立二叉排序树,并进行前序,中序,后序遍历。输入描述:输入第一行包括一个整数n(1<=n<=100)。接下来的一行包括n个整数。输出描述:可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序、中序和后序遍历。每种遍历结果输出一行。每行最后一个数据之后有一个空格。输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出。示例1输入51 6 5 9 8输出1 6 5 9原创 2021-02-08 18:12:04 · 190 阅读 · 1 评论