算法题
算法实训+零散题
❁满城风絮*
风烟残尽,独影阑珊
展开
-
查找整数对
【题目】一个长度为n的整型数组a,给定整数x,设计一个复杂度不超过O(nlog2n)的算法,查找出这个数组中所有两两和为x的整数对并输出。【思路】先对该数组进行排序,可以考虑快速排序或归并排序,然后分别从数组的小端i=0和大端j=n-1开始,将两数相加,若和大于x,则大端前移j–,若小于x则小端后移i++,相等则输出两个数,直至i>=j。#include <iostream>#include <algorithm>#define MAX 100using name原创 2022-03-21 20:54:42 · 730 阅读 · 0 评论 -
动态规划——最小找钱问题
题目:这是一个古老而又经典的问题。用给定的几种钱币凑成某个钱数,一般而言有多种方式。例如,给定了7种钱币面值为6 2 5 10 20 50 100,用来凑299元,可以用几种方案。我们的任务就是,给定若干个互不相同的钱币面值,编程计算,最少需要多少个钱币才能凑成某个给出的钱数。思路:1、对于这个硬币问题,我们每次都是取硬币,或者不取硬币。因此我们可以将这个硬币问题切割成若干个子问题(取不取这种硬币),而且每次决策都会用到这个子问题。而且所有的子问题中必定存在最优解。2、每次取硬币,都仅仅是做出决策原创 2021-10-25 17:05:49 · 1342 阅读 · 0 评论 -
蚂蚁掉落最短和最长时间
思路:代码:#include <stdio.h>#include <stdlib.h>#define MAX 100000int l,n,i;int x[MAX];int max(int a,int b)//最大值函数 { return a>b?a:b;} int min(int a,int b)//最小值函数 { return a>b?b:a;}int solve(){ int t1=0,t2=0; for(i=0;i<.原创 2020-12-06 22:07:40 · 178 阅读 · 0 评论 -
回形取数
问题描述 回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。输入格式 输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。输出格式 输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。样例输入3 31 2 34 5 67...转载 2020-03-02 17:15:25 · 331 阅读 · 2 评论 -
调换字符串
输入字符串个数、调换个数以及字符串,输出调换后字符串排列。输入5 2A1B2C3D4E5输出D4E5A1B2C3代码:#include <iostream>#include <cstring> using namespace std; int main(){ string a[20],b[20]; int n,k,i,j; cin>>n>>k; for(i=0;i<n;i++) cin>>a[原创 2021-03-20 00:18:44 · 171 阅读 · 0 评论 -
水洼的个数—深度优先搜索
#include <iostream>using namespace std;#define MAX_SIZE 100int n, m;char field[MAX_SIZE][MAX_SIZE+1];void dfs(int x, int y){ field[x][y] = '-'; //把当前位置替换成'-' for(int dx=-1; dx<=1; dx++) //循环遍历8个方向 for(int dy=-1;dy<=1;dy++原创 2021-01-16 18:22:29 · 250 阅读 · 0 评论 -
三角计数
题目描述给定一个n,问在凸正2n+1边形中顶点在凸正2n+1边形上的不同的锐角三角形有多少个,多边形顶点标号为A1,A2,A3,A2n+1,两个三角形不同当且仅当顶点标号不同。程序输入说明多组数据,第一行输入数据组数T (1 <T< 100000),后面T行,每一行给出一个n (1<n< 100000)。程序输出说明共输出T行,每一行输出不同锐角三角形的个数。程序输入样例223程序输出样例514思路:求出能切割成的所有三角形个数,再减去钝角和直角三角形个数原创 2020-10-14 13:47:20 · 273 阅读 · 0 评论 -
贪心算法例4
有1元、5元、10元、50元、100元、500元的硬币无穷多枚,现在用这些硬币支付s元,最少需要多少枚硬币例:输入763输出需要500元硬币1枚需要100元硬币2枚需要50元硬币1枚需要10元硬币1枚需要1元硬币3枚#include <stdio.h>#include <stdlib.h>int main(int argc, char *argv[]...原创 2020-04-08 17:31:18 · 154 阅读 · 0 评论 -
贪心算法例2
给定长度为N的字符串S,要构造一个长度为N的字符串T。T是一个空串,随后反复进行下列的任意操作。1、从S的头部删除一个字符,加到T的尾部2、从S的尾部删除一个字符,加到T的尾部目标是为了构造字典序尽可能小的字符串T。#include <bits/stdc++.h> using namespace std;//万能头文件,搭配使用 const int MAX=1024;ch...原创 2020-04-25 21:29:14 · 236 阅读 · 0 评论 -
答题排名
题目:有n个学生进行答题,每题分值分别是10、20、30、50、80、40,输入字符代表学生姓名,字符串代表答题情况,若正确则为1,错误为0,输出他们的排名。输入3A 101001B 111101C 100001输出BAC#include <iostream>#include <cstring>#include <algorithm> using namespace std; int f[6]={10,20,30,50,80,40};原创 2021-03-19 23:18:10 · 211 阅读 · 0 评论 -
贪心算法例1
有n项工作,每项工作分别在si开始,fi结束。对于每项工作,你都可以选择参加或者不参加,选择参加就必须全程参与(开始和结束时间不可重复),问最多可以参加多少项工作。思路:选择最早结束的工作,这样才能留下时间选择更多工作注:已排序#include <stdio.h>template<class T> void choose(int n,T s[],T f[],boo...原创 2020-04-25 19:04:34 · 137 阅读 · 0 评论 -
动态规划之采药
题目描述张三是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。” 如果你是张三...原创 2020-05-03 21:36:46 · 141 阅读 · 0 评论 -
动态规划算法之拦截导弹
一种导弹拦截系统,虽然它的第一发炮弹能够到达任意高度,但是以后每一发炮弹都不能高于前一发的高度。计算最多拦截导弹数及需要导弹拦截系统数。输入:389 207 155 300 299 170 158 65输出:62#include<bits/stdc++.h>using namespace std;int h[101],a[101],b[101];int main()...原创 2020-05-03 20:33:18 · 436 阅读 · 0 评论 -
输出大于且紧靠m的n个素数
输出大于且紧靠m的n个素数例:输入m=9 n=3输出11 13 17#include<stdio.h>#include<math.h>int main(){ int m,n; scanf("%d%d",&m,&n); int i=0,c,k=m+1,p; while(i<n) { p=sqrt(k); for(c=...原创 2020-04-04 13:14:28 · 2152 阅读 · 1 评论 -
贪心算法例3
在一条直线上,有n个点,点的位置为Xi。从这n个点中选择若干个,给他们加上标记。对于每一个点,其距离为R以内的区域里必须有一个被标记的点(自己本身带有标记,认为与其距离为0的地方有个标记的点 )。在满足这个条件的情况下,希望能为尽可能少的的点添加标记。问至少要有多少点被加上标记。例:N=6,R=10 ,1 7 15 20 30 50则3个点被标记,即15 30 50从最左边的开始考虑。对于这...原创 2020-04-25 23:06:38 · 1719 阅读 · 0 评论 -
抽签
思路:由题知,需要寻找数满足a+b+c+d=m,采用二分查找法。检查是否有c和d使得c+d=m-a-b,这种情况要预先枚举出c+d所得的n*n个数字并排好序,再利用二分搜索。记所要查找的值m-a-b为x,预先把数组排好序,然后看数组中央的数字,可知如果它比x小,x只可能在它的后面半段;如果它比x大, x只可能在它的前面半段。如果再将上述方法运用在已经减半的x的存在区间上,x的存在区间就变成了初始的1/4,这样反复操作就可以不断缩小x的存在区间,最终可以确定x存在与否。代码:#inclu..原创 2021-03-19 12:50:13 · 101 阅读 · 0 评论 -
硬币问题—贪心算法
分析:代码:#include <iostream>using namespace std;const int a[6]={1,5,10,50,100,500};int main(){ int s[6],i,t,count=0,total; cout<<"分别输入1,5,10,50,100,500硬币的个数:"<<endl; for(i=0;i<6;i++) cin>>s[i]; cout<<"输入支付钱数:"&l.原创 2021-04-10 11:26:20 · 510 阅读 · 0 评论 -
部分和问题
思路:代码:#include <cstdio>using namespace std;#define MAX 20int a[MAX];int n,k;bool dfs(int i,int sum){ if(i==n) return sum == k; //若遍历结束,返回sum==k是否成立,成立则返回1,否则返回0 if(dfs(i+1,sum)) //不加上a[i] return true; if(dfs(i+1,sum+a[i])) /..原创 2020-12-06 22:16:55 · 133 阅读 · 0 评论 -
判断是否为素数
输入一个数判断是否为素数#include <stdio.h>#include <stdbool.h> //使用bool的头文件 int main(int argc, char *argv[]) { int n,i; bool isPrime=true;//true表示素数 逻辑型:true:1 false:0 scanf("%d",&...原创 2020-03-22 19:12:50 · 204 阅读 · 0 评论 -
判断和
题目描述输入n个数a和一个数k(0<a、k<=1e^9),问是否能从n个数中选择一些数,使得他们的和是k,如果可以输出"YES",否则输出"NO"。程序输入说明首先是一个数n,接下来是n个数a,最后是一个数k(0<a、k<=1e^9) 。程序输出说明如果可以输出"YES",否则输出“NO"。程序输入样例23 58程序输出样例YES思路:可以将数字k看成一个长度是k的凹形长槽, n个数是长度为对应a的小木棒,题目转化成是否能在n个小木棒中挑选几根恰好填满凹槽原创 2020-10-14 11:21:03 · 185 阅读 · 0 评论 -
如何删数
题目:键盘输入一个高精度的正整数n(<=240位),去掉任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的n和s,寻找一种方案,使得剩下的数最小。输入1785434输出13思路:高位越小则值越小,尽可能删除较大的高位数字。将相邻两位比较,若高位比低位大,则删除高位。代码:#include <iostream>#include <algorithm>#include <cstring>using namespace std原创 2020-12-11 23:59:29 · 227 阅读 · 0 评论 -
动态规划算法之数塔
数塔从顶部出发,在每一结点可选择左下或右下走,一直走到底层,找出一条路径使数值最大输入:472 34 5 71 12 4 8输出:27#include <bits/stdc++.h>using namespace std;int n,a[101][101];int maxsum(int x,int y){ if(x==n-1) retu...原创 2020-05-02 15:50:42 · 456 阅读 · 0 评论 -
选数
题目描述:已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为:3+7+12=22,3+7+19=29,7+12+19=38,3+12+19=34。现在,要求你计算出和为素数共有多少种。例如上例,只有一种的和为素数:3+7+19=29)。输入:n , k (1<=n<=20,k<n)x1,x2,…,xn (1<=xi&原创 2021-03-18 23:29:49 · 290 阅读 · 0 评论 -
分治法——归并排序
题目:使用归并排序算法对10个数实现升序排列,输出排序结果。分治步骤如下:1)申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;2)设定两个指针,最初位置分别为两个已经排序序列的起始位置;3)比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置重复3直到某一序列结束,将另一序列剩下的所有元素直接复制到合并序列尾。#include <bits/stdc++.h> using namespace std;#define COUNT 10原创 2021-09-23 10:15:19 · 513 阅读 · 0 评论 -
分治法——整数因子分解
大于1的正整数n可以分解为:n=x1×x2×…×xm。例如,当n=18时,共有8种不同的分解式。对于给定的正整数n,计算n共有多少种不同的分解式。//////////////////////////////////////////////////////////////////////*/#include <bits/stdc++.h>using namespace std;////////////////////////////////////////////////////////原创 2021-09-21 11:34:41 · 3504 阅读 · 0 评论