自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(54)
  • 收藏
  • 关注

原创 筛质数—(朴素筛法、埃氏筛法、欧拉筛法(线性筛法))

首先有一个最暴力的写法int primes[N],cnt=0;bool st[N]={false};void get_prime(int n){ for(int i=2;i<=n;i++) { if(!st[i]) primes[cnt++]=n; for(int j=i+i;j<=n;j+=i) st[j]=true; }}1.埃拉托色尼筛法(the Sieve of Er

2020-11-18 11:11:06 1074 1

原创 试除法解决分解质因数

1.利用试除法分解质因数时最原始的写法是下面的divide1()函数,直接从2~n遍历循环,但是时间复杂度是O(N),很容易看出若n是一个很大的数会导致超时,因此要改进divide1()函数。void divide1(int n){ for(int i=2;i<=n;i++) if(n%i==0) { int s=0; while(n%i==0) {

2020-11-17 09:49:48 1222

原创 试除法解决质数的判定

1.利用试除法判定质数时最原始的写法是下面的is_prime1()函数,直接从2~n-1遍历循环,但是时间复杂度是O(N),很容易看出若n是一个很大的数会导致超时,因此要改进is_prime1()函数。bool is_prime1(int n){ if(n<2) return false; for(int i=2;i<n;i++){ if(n%i==0) return false; } return true;}

2020-11-17 09:17:59 1397 2

原创 图的遍历

一、实验目的通过本实验的学习,复习队列结构的使用,掌握图的特性,理解图结构的构造方法,为灵活运用图奠定基础。二、实验内容【问题描述】很多涉及图上操作的算法都是以图的遍历操作为基础的。试写一个程序,演示在连通的无向图上访问全部结点的操作。【基本要求】以邻接表为存储结构,实现连通无向图的广度优先遍历。以用户指定的结点为起点,分别输出遍历的结点访问序列。【测试数据】自己设定【实现提示】设图的结点不超过30个,每个结点用一个编号表示(如果一个图有n个结点,则它们的编号分别为1

2020-11-16 19:08:16 994

原创 二叉树的创建和遍历

通过本实验的学习,掌握二叉树操作的实现原理与方法,进一步掌握递归算法的设计方法,为灵活运用二叉树奠定基础。二、实验内容【问题描述】用递归的方法先序创建二叉树。用递归的方法先序(中序、后序)遍历二叉树。【基本要求】用二叉链表表示和存储二叉树,实现二叉树的创建存储和遍历显示。【测试数据】输入:9二叉树:【实现提示】为了识别叶子节点,需要用标记将二叉树变成扩展二叉树的形式(将叶子节点和只有一个分支的分支节点的孩子用标记补全)。三、实验原理、方法和

2020-11-16 18:37:59 426 1

原创 八皇后问题(回溯法)

八皇后问题(英文:Eight queens),是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。如果经过±90度、±180度旋转,和对角线对称变换的摆法看成一类,共有42类。 回溯算法思路八皇后问题如果用穷举...

2020-10-24 18:15:44 13802 3

原创 蓝桥杯省赛真题2017题解

1.标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦,但又不好推辞。 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的。 小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定。 现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物。 取款机只能提供100元面额的纸币。小明想尽可能少取些现金,够用就行了。 你的任务是计算出,小明最少需要取多...

2020-10-15 08:54:25 442

原创 蓝桥杯省赛真题2016题解

1.煤球数目有一堆煤球,堆成三角棱锥形。具体:第一层放1个,第二层3个(排列成三角形),第三层6个(排列成三角形),第四层10个(排列成三角形),....如果一共有100层,共有多少个煤球?请填表示煤球总数目的数字。注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。答案:171700代码实现:#include<bits/stdc++.h>using namespace std;int main(){ int a=0,i,sum=0;.

2020-10-12 21:45:29 624

原创 蓝桥杯省赛真题2015题解

1.奖券数目有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。某抽奖活动的奖券号码是5位数(10000-99999),要求其中不要出现带“4”的号码,主办单位请你计算一下,如果任何两张奖券不重号,最多可发出奖券多少张。请提交该数字(一个整数),不要写任何多余的内容或说明性文字。答案:52488代码实现:#include<bits/stdc++.h>using namespace std;int.

2020-10-11 19:29:34 2686

原创 蓝桥杯省赛真题2014题解

1.标题:啤酒和饮料 啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。 我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。 注意:答案是一个整数。请通过浏览器提交答案。 不要书写任何多余的内容(例如:写了饮料的数量,添加说明文字等)。答案:11代码实现:#include<bits/stdc++.h>using namespace std;int main(){ int x,y; for(...

2020-10-11 11:07:31 375

原创 蓝桥杯省赛真题2013题解

1.题目标题: 高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210。后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢? 高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。高斯获得博士学位的那天日记上标着:8113,请...

2020-10-07 13:16:39 2300

原创 三种括号的匹配问题--栈

​​​​​​【问题描述】利用栈解决括号匹配问题。【基本要求】采用链式存储实现栈的初始化、入栈、出栈操作。 给定一个括号序列,里面包括圆括号和方括号,编程检验该括号序列中括号是否配对。代码:#include<bits/stdc++.h>using namespace std;typedef struct linknode{ char data; struct linknode *next;}LinkSNode; void InsitStack(LinkSNo.

2020-10-05 19:29:25 679

原创 有关lower_bound()和upper_bound()的使用

对lower_bound函数来说,它寻找的是第一个满足条件“值大于等于x”的元素的位置;而对于upper_bound函数来说,它寻找的是第一个满足条件“值大于x”的元素的位置。lower_bound函数://a[]为递增序列,x为欲查询的数,函数返回第一个大于等于x的元素位置//二分上下界为左闭右闭的[left,right],传入的初值为[0,n]int lower_bound(int a[],int left,iint right,int x){ int mid; //mid为

2020-10-05 10:51:39 160

原创 【Codeforces】 Vitaly and Strings

问题描述维塔利是一个勤奋的学生,在大学阶段,他从来没有逃过一堂课。他总是按时做作业,并顺利通过考试。在最后一节课,老师给了他两个字符串s和t。这两个字符串的长度相同,由小写英文字母组成,字符串s的字典序比串t小。维塔利想知道是否有这样的字符串:字典序比字符串s大,同时字典序小于串t。此字符串也应包括小写英文字母和相同的长度。让我们帮维塔利解决这个简单的问题!Input第一行包含字符串s(1≤|s| ≤100),由小写英文字母组成。这里,|s| 表示字符串s的长度。第二行包含字符串t(

2020-10-05 10:08:55 151

原创 一元多项式相加--链表

【问题描述】设计一个一元稀疏多项式简单计算器。【基本要求】一元稀疏多项式简单计算器的基本功能是:输入并建立多项式; 输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,…,cn,en,其中n是多项式的项数,ci,ei分别是第i项的系数和指数,序列按指数降序排列; 多项式a和b相加,建立多项式a+b; 多项式a和b相减,建立多项式a-b。【测试数据】(2x+5x8-3.1x11)+(7-5x8+11x9)=(-3.1x11+11x9+2x+7); (6x-3-x+4.4.

2020-09-29 09:02:18 255

原创 【第九届河南省大学生程序设计大赛】F题:Decimal integer conversion

问题描述:XiaoMing likes mathematics, and he is just learning how to convert numbers between differentbases , but he keeps making errors since he is only 6 years old. Whenever XiaoMing converts anumber to a new base and writes down the result, he always writ

2020-09-27 10:46:08 123

原创 【第九届河南省大学生程序设计大赛】A题:表达式求值

问题描述:假设表达式定义为:1. 一个十进制的正整数 X 是一个表达式。2. 如果 X 和 Y 是 表达式,则 X+Y, X*Y 也是表达式; *优先级高于+.3. 如果 X 和 Y 是 表达式,则 函数 Smax(X,Y)也是表达式,其值为:先分别求出 X ,Y值的各位数字之和,再从中选最大数。4.如果 X 是 表达式,则 (X)也是表达式。例如:表达式 12*(2+3)+Smax(333,220+280) 的值为 69。请你编程,对给定的表达式,输出其值。 输入:【标.

2020-09-27 10:13:06 233

原创 合并两个有序表--顺序表

【问题描述】编制一个能演示将两个有序表合并为一个有序表的程序。【基本要求】已知递增有序线性表LA和LB,现将LA和LB合并到LC,LC也是递增有序的。【测试数据】LA=(3,5,8,11) LB=(2,6,8,9,11,15,20)合并后的LC=(2,3,5,6,8,9,11,15,20)代码:#include<bits/stdc++.h>const int MaxSize=100;using namespace std;typedef int El..

2020-09-21 11:47:46 5139 1

原创 删除特定元素--顺序表

方法一:扫描表L,重建只包含不等于x的元素的表。用k记录不等于x的元素的个数;若当前元素不为x,则将其插入L中,k++。#include<bits/stdc++.h>const int MaxSize=100;using namespace std;typedef int ElemType;typedef struct{ ElemType data[MaxSize]; int length;}SqList;void CreateList(SqList *

2020-09-21 11:16:51 498

原创 浅谈欧几里德算法 GCD和LCM

首先介绍什么欧几里得算法最大公约数问题是最早被研究的算法问题之一了,并且是ACM竞赛中能涉及到的很多数论内容,比如模线性方程,模线性方程组的基础。欧几里得算法 (Euclidean algorithm) ,即大部分选手所知的“辗转相除法”,其核心在于不断将两数规模变小,最后实现对数时间内求解两个数的最大公约数。其核心定理是:gcd(a,b)=gcd(b,a%b)下面先证明这个核心定理:证明:设a=kb+r,其中k和r分别为a除以b得到的商和余数。则有r=a-kb成立。设d为a

2020-08-30 16:17:38 380

原创 三个取整函数ceil()、floor()、round()

首先知道floor()、ceil()和round()函数都在math.h头文件中。三个与取整有关的方法:ceil,floor,round,这些方法的作用于它们的英文名称的含义相对应:floor()的英文含义是地板,所以是向下取整,方便记忆叫它地板函数。会取不大于自变量的最大整数,这样自变量是3.1或3.9是没有区别的,返回都是3;自变量是-2.1或-2.9也是没有区别的,返回都是-3; ceil()的英文含义天花板,所以是向上取整,它就是天花板函数。会取不小于自变量的最大整数,这样自变量是3.1或

2020-08-26 11:02:53 2892

原创 【Codeforces】 Roadside Trees (Simplified Edition)

题目链接题目大意:给你一个序列h,表示一排树的高度,你每秒可以完成下列事件之一:将自己的高度改变1。 在树顶停留不动。 跳到下一棵树的同一高度,要求下一棵树的高度不低于你现在的高度。最开始你位于第一棵树的底下(高度为0)输出在每一棵树的树顶都停留1s需要的最短时间。AC:#include<iostream>using namespace std;int main(){ int n, i, sum=0; int a[100003]; cin &gt...

2020-08-05 01:46:02 221

原创 【Codeforces】You‘re Given a String...

题目链接题目大意:在所给字符串中找出最少出现两次的最长子串的长度。AC:#include<iostream>#include<cstring>#include<map>using namespace std;map<string, int> m;string s, str;int main(){ cin >> s; for(int i=s.size();i>=1;i--) {

2020-08-05 01:26:09 179

原创 【Codeforces】Roma and Lucky Numbers

题目链接题目大意:有一种数名叫 lucky number,这些数都是正整数,且其十进制表示只包含 lucky digits44和77。举个例子,4747,744744,44是 lucky number;而55,1717,467467不是。Roma 有n个数,他想:有几个数包含的lucky digits 不超过k个。思路:对于n个整数,在每次输入后对其每个位权上的数进行判断是不是4或者7,若是则用cnt加一并在最终看cnt是否大于k;若不大于k,就对ans加一。AC:...

2020-08-05 00:55:17 210

原创 有关ios::sync_with_stdio(false);和 cin.tie(nullptr);的介绍与意义

整体来说它们是对C++输入输出流的优化(可以提高速度),但同时也会产生一定的副作用。​#include <iostream>int main() { std::ios::sync_with_stdio(false); cin.tie(nullptr); ... }1、ios::sync_with_stdio(false);首先了解ios::sync_with_stdio(false);是C++的输入输出流(iostream)是否兼容C的输入输出(stdio)的开关。

2020-07-31 10:35:24 4267 1

原创 【Codeforces】Doors Breaking and Repairing

题目链接题目大意:A,B两个人玩一个回合制的游戏。他们面前共有N扇门,每个回合分为两个阶段:第一阶段:A走,他遇到一个门可以破坏这个门的耐久度,最大可破坏x(破坏后门的耐久度不能低于0);第二阶段:B走,他遇到一个门可以修复这个门的耐久度,最多修复y(修复后不能高于门的起始耐久度)。这个游戏持续回合,问当游戏结束,有多少耐久度为0的门。思路:游戏回合数(间接意思回合无限大)表明,这道题的主要突破点在于x、y的大小:当x>y时,修复的速度没有破坏的速度快,所以无论B如何修复

2020-07-27 20:21:13 158

原创 【Codeforces】Birthday

题目链接题目大意:n人围成一个圈,每个人有自己的高度,对这n个人进行重新的排列,使得满足任意两个人之间高度差的最大值最小并输出这个顺序。思路:因为是环形排列,所以先将原数组从小到大排序,然后左边放一个,右边放一个。可以利用按大小顺序排序后的下标奇偶性来判断放左还是放右。AC:#include <iostream>#include <algorithm>using namespace std;typedef long long ll;ll a[1010]

2020-07-27 19:24:39 179

原创 【洛谷】修理牛棚 Barn Repair(贪心、快排)

题目链接思路:首先可以先进行一次特判,如果给的木板数大于牛的总数则可以直接输出牛的数目(此时牛的数目就是最短木板总长度)。其次题目只是说明了有c只牛,它们的牛棚编号并非有序,所以要先对牛棚编号从大到小排序(从小到大也可以,从大到小更容易表示)。然后根据牛棚编号算出来每相邻两个牛棚之间的距离并对这个距离从大到小排序以及算出相距最远的两个牛棚距离ans,因为一共m个木板,所以对ans由大到小减去m-1个比较大距离所剩大小就是最短木板总长度。AC:#include<iostream>

2020-07-27 15:23:45 260

原创 【洛谷】排队接水(贪心、排序)

题目链接思路:需要记录下标进行排序,因此可以使用结构体来存储每个人所用时间和下标(初始位置)。又因为要求平均排队时间最短,所以要把时间短的排在前面,利用sort可以快速排序。最终输出排序后的下标顺序,然后遍历计算总等待时间除以总人数并输出即可。AC:#include<iostream>#include<cstdio>#include<algorithm>using namespace std;struct pre{ int b,num;

2020-07-27 11:13:54 280

原创 【洛谷】搬运工(dp || dfs)

题目链接思路(dp):设f[i][j][k]表示三堆书分别剩下i、j、k本时(已经拿过的不计),能够得到的最大值,最后输出f[a][b][c]。dp方程:f[i][j][k] = max (f[i-1][j][k]+x[i]*s, max (f[i][j-1][k]+y[j]*s, f[i][j][k-1]+z[k]*s)) (s是当前要乘上的体力值)AC:#include<cstdio>#include<algorithm>#include<iostre

2020-07-27 01:19:40 164

原创 【HDU】Bone Collector (01背包、贪心)

题目链接此题与【POJ】Charm Bracelet思路一样,题目大意也基本相同,所以就不赘述了。AC:#include<iostream>#include<algorithm>#include<memory.h>const int N=10000;using namespace std;int v[N], w[N], dp[N];int main(){ int t,n,s; cin >> t; while(t

2020-07-27 00:32:48 132

原创 【POJ】Charm Bracelet (01背包、贪心)

题目链接题目大意:有一个容量为M的背包和N(1 ≤N≤ 3,402) 件物品;对于第i件物品的重量是Wi(1 ≤Wi≤ 400),而且它的价值是Di(1 ≤Di≤ 100)。现在将这N件中的其中几件物品装入背包使装入物品的总重量不超过背包容量M(1 ≤M≤ 12,880),同时使这些物品总价值最大,最后输出这个价值。AC:#include<iostream>#include<algorithm>#include<memory.h&gt...

2020-07-27 00:03:50 133

原创 【PAT】组个最小数(贪心)

题目链接思路:这道题不难。首先为了防止最高位是0(题目中已经说了,含有至少一个非零数),那么就从1的位置开始向后查直到找到一个非零数并输出,然后减少一个这个数,再从零重新遍历输出,进而一定是最小的。AC:#include<iostream>using namespace std;int main(){ int a[10],i; for(i=0;i<10;i++) cin >> a[i]; for(i=1;i<10;i++) { if

2020-07-26 22:18:08 119

原创 【PAT】月饼(贪心)

原题链接思路:因为是要获得最大收益首先要算出每种月饼单价,然后从选择最高单价开始售卖。因此我们要先根据库存量和总售价来计算出月饼的单价,之后再进行从高到低排序。AC:#include<iostream>#include<algorithm>using namespace std;struct mooncake{ double store;//库存量 double sell;//总售价 double price;//单价 }cake[1100];boo

2020-07-26 19:20:55 173

原创 【Codeforces】Sequential Nim

思路:这道题怎么说呢,我起初是天真的查找奇偶数,后来发现发现想错了,就查找非1数个数和数字1的个数,但搞了半天比较迷,最后发现规律:若总数n1,则一定是Firsrt; 若总数n1,查找第一个非1数前的1的个数s;可以发现只有在s0并且s是偶数个时是Second;其他的一定是Firsrt。根据题解的规律:记录数组中所有1的个数y,以及第一个非1数的位置f;若总数ny,若是奇数则一定是Firsrt;若是偶数则一定是Second; 若总数ny,f是偶数时则一定是Second;f是奇数

2020-07-22 10:54:36 227

原创 【Codeforces】Common Subsequence (map)

思路:这道题总的来说并不难,但是起初我是利用两个数组来写的。在没找到第一个相同元素时,b数组每输入一个元素则遍历一次a数组查找是否有相同元素,时间复杂度太大。但是后来写完发现利用map直接把元素当作下标存入会更加迅速,节省了时间。AC(两个数组):#include<iostream>using namespace std;int main(){ int t; cin >> t; while(t--) { int n,m; cin >>

2020-07-22 09:36:04 138

原创 【PAT】Shortest Distance(前缀和)

思路:这道题时间卡的比较死,因此可以利用前缀和来计算两点距离不需要再次循环,从而大大的缩短时间,提高效率;其思路不难,值得注意的是a与b没说明大小,因此需要在写代码时比较一下。AC:#include <iostream>#include<algorithm>#include<cmath>using namespace std;int dist[100010];int sum[100010]={0};int main(){ int N;

2020-07-20 09:18:20 175

原创 【PAT】PAT Ranking

PAT:A1025PAT Ranking(25 分)Programming Ability Test (PAT) is organized by the College of Computer Science and Technology of Zhejiang University. Each test is supposed to run simultaneously in several places, and the ranklists will be merged immediately ..

2020-07-19 15:39:00 109

原创 全排列问题解法

全排列的定义: 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。有关代码:利用递归思想:#include <iostream>#include <cstdio>using namespace std;void permutation(int k, int n, int a[]){ //递归到底层 if(k == n-1) { ...

2020-07-19 15:27:07 263

原创 【Codeforces】Vasya and String(二分、前缀和)

思路:利用二分搜索和前缀和解决。AC:#include<iostream>#include<algorithm>using namespace std;int n, k;string s;int sum[100005];int check(int x){ for(int i=0 ; i+x<=n ; i++) { if (sum[i+x]-sum[i]>=x-k || sum[i + x]-sum[i]<=

2020-07-15 11:26:50 201

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除