算法笔记
奋力奔跑
这个作者很懒,什么都没留下…
展开
-
结构体的优先级设置
结构体的优先级设置struct fruit{ string name; int price; friend bool operator < (fruit f1,fruit f2){ return f1.price>f2.price; }};重载时只能用小于号<,用大于号会报错,因为从数学上来说只需要重载小于号,即f1>f2等价于判断f2<f1,而f1==f2则等价于判断!(f1<f2)&&!(f2>f1)#include<原创 2021-05-29 20:56:47 · 309 阅读 · 0 评论 -
C++标准模板库(STL)介绍
C++标准模板库介绍1.vector的常见用法详解1.1vector的定义1.2 vector的元素的访问通过下标访问迭代器访问1.vector的常见用法详解1.1vector的定义文件头//文件头#include<stdio.h>#include<vector>using namespace std;定义vector<typename> name;//例如vector<int> name;vector<char> nam原创 2021-05-25 21:07:28 · 78 阅读 · 0 评论 -
字符串的hash进阶(算法笔记)题目:给出N个只有小写字母的字符串,求其中不同的字符串的个数
字符串的hash进阶(算法笔记)题目:给出N个只有小写字母的字符串,求其中不同的字符串的个数set总会自动将重复的数字删去,因此选择用set#include<iostream>#include<string>#include<set>using namespace std;set<int> st;const int MOD=100000007;const int P=10000019;long long hashFunc(string st原创 2021-05-23 21:47:15 · 654 阅读 · 0 评论 -
组合数
组合数关于n! 的一个问题组合数的计算方法1:通过定义式直接计算方法2:通过递推公式计算方法三:通过定义式的变形来计算关于n! 的一个问题求 n1中有多少个质因子p.n!中有(n/p+n/p2 +n/p3 +…)//计算n!中有多少个质因子pint cal (int n,int p){ int ans=0; while(n){ ans+=n/p; n/=p; } return ans;}如果想要计算n!的末尾有多少个零:由于0的个数等于n!中因子10的个数,而这又等于n原创 2021-05-16 17:39:25 · 173 阅读 · 0 评论 -
作业比赛编号 : 100000593 - 《算法笔记》5.6小节——数学问题->大整数运算 问题 B: N的阶乘
作业比赛编号 : 100000593 - 《算法笔记》5.6小节——数学问题->大整数运算 问题 B: N的阶乘int 型数与大整数的成绩,注意要将大整数初始化为1,长度也为1,即 while(scanf("%d",&b)!=EOF){ bign a; a.num[0]=1; a.len=1; for(int i=b;i>0;i--) { a=multi(a,i);原创 2021-05-08 19:53:26 · 121 阅读 · 0 评论 -
作业比赛编号 : 100000593 - 《算法笔记》5.6小节——数学问题->大整数运算 问题 A: a+b
作业比赛编号 : 100000593 - 《算法笔记》5.6小节——数学问题->大整数运算 问题 A: a+b题目描述:代码#include<cstdio>#include<cstring>typedef struct bign{ int num[1001];//起初一直报错,因为用的为int num[1000]; int len; bign(){ memset(num,0,sizeof(num));原创 2021-05-08 19:30:45 · 128 阅读 · 0 评论 -
大整数运算
大整数运算大整数的存储初始化转换(将字符串转换为整数数组)大整数大小的比较大整数的四则运算大整数的加法运算大整数的减法运算大整数的乘法运算(大整数与int型数据的乘法)大整数除法运算打印函数代码的实现大整数的存储大整数又称为高精度整数,其含义就是基本数据类型无法存储其精度的整数大整数的高位存储在数组的高位,低位存储在数组的低位(需要进行从字符串到整型数组的转换)例如:2345 存储为d[0]=5,d[1]=4,…但是,当用字符串读取数字时,得到的为高位存储在数组的低位用结构体来定义大数,并用原创 2021-05-06 15:27:37 · 85 阅读 · 0 评论 -
作业比赛编号 : 100000592 - 《算法笔记》5.5小节——数学问题->质因子分解 问题 E: 完数与盈数
作业比赛编号 : 100000592 - 《算法笔记》5.5小节——数学问题->质因子分解 问题 E: 完数与盈数注意输出格式代码#include<cstdio>#include<cmath>int judge(int n){ int sum=1; int k=sqrt(n); for(int i=2;i<=k;i++) { if(n%i==0) sum=sum+i+n/i; }原创 2021-05-05 17:55:22 · 124 阅读 · 0 评论 -
作业比赛编号 : 100000592 - 《算法笔记》5.5小节——数学问题->质因子分解 问题 D: 约数的个数
作业比赛编号 : 100000592 - 《算法笔记》5.5小节——数学问题->质因子分解 问题 D: 约数的个数(题目来源codeup,侵删)思路int yueShu(int n){ int k=sqrt(n); //因子分布在算术平方根的两侧,特殊情况为,正好开方尽,此时增加一个因子,所以为特殊情况讨论 int sum=0; for(int i=1;i<=k;i++) { if(n%i==0) sum+=原创 2021-05-05 17:18:51 · 116 阅读 · 0 评论 -
作业比赛编号 : 100000592 - 《算法笔记》5.5小节——数学问题->质因子分解 问题 A: 完数
作业比赛编号 : 100000592 - 《算法笔记》5.5小节——数学问题->质因子分解 问题 A: 完数#include<cstdio>#include<cmath>bool wanShu(int n){ int sum=1; for(int i=2;i<=sqrt(n);i++) { if(n%i==0) sum=sum+i+n/i; } if(sum==n) return t原创 2021-05-04 21:04:20 · 115 阅读 · 0 评论 -
作业比赛编号 : 100000591 - 《算法笔记》5.4小节——数学问题->素数问题 C: Goldbach‘s Conjecture
作业比赛编号 : 100000591 - 《算法笔记》5.4小节——数学问题->素数问题 C: Goldbach’s Conjecture题意为:任何不小于4的偶数都可以找到至少一组两个素数的和4=2+2;10=5+5=3+7代码#include<cstdio>#include<cmath>bool primer(int n){ int k=sqrt(n); for(int i=2;i<=k;i++) if(n%i==原创 2021-05-04 20:07:56 · 125 阅读 · 0 评论 -
作业比赛编号 : 100000590 - 《算法笔记》5.3小节——数学问题->分数的四则运算 问题 A: 分数矩阵
作业比赛编号 : 100000590 - 《算法笔记》5.3小节——数学问题->分数的四则运算 问题 A: 分数矩阵献给理解能力和我一样堪忧的你(不差者忽略):理解能力堪忧的我最初竟没理解题意,最终经过悟,才最终懂得意思,发现矩阵的数关于对角线对称...原创 2021-05-04 17:48:49 · 103 阅读 · 0 评论 -
作业比赛编号 : 100000589 - 《算法笔记》5.2小节——数学问题->最大公约数与最小公倍数 问题 A: Least Common Multiple
作业比赛编号 : 100000589 - 《算法笔记》5.2小节——数学问题->最大公约数与最小公倍数 问题 A: Least Common Multiple(题目来源Codeup侵删)代码#include<cstdio>//最大公因数 int gcd(int a,int b){ if(b==0) return a; else return gcd(b,a%b);}int main(){ int m,n; int i,j; int原创 2021-05-02 18:58:41 · 117 阅读 · 0 评论 -
PAT1023 组个最小数给定数字 0-9 各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小例如:给定两个0两个1三个5一个8得到的数字就是10015558
1023 组个最小数 (20 分)给定数字 0-9 各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意 0 不能做首位)。例如:给定两个 0,两个 1,三个 5,一个 8,我们得到的最小的数就是 10015558。现给定数字,请编写程序输出能够组成的最小的数。(题目来源PAT,侵删)输入格式:输入在一行中给出 10 个非负整数,顺序表示我们拥有数字 0、数字 1、……数字 9 的个数。整数间用一个空格分隔。10 个数字的总个数不超过 50,且至少拥有 1 个原创 2021-02-09 10:16:24 · 8442 阅读 · 4 评论 -
PAT1020 月饼 月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价以及市场的最大需求量请你计算可以获得的最大收益是多少销售时允许取出一部分
1020 月饼 (25 分)月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有 3 种月饼,其库存量分别为 18、15、10 万吨,总售价分别为 75、72、45 亿元。如果市场的最大需求量只有 20 万吨,那么我们最大收益策略应该是卖出全部 15 万吨第 2 种月饼、以及 5 万吨第 3 种月饼,获得 72 + 45/2 =原创 2021-02-09 14:48:16 · 2554 阅读 · 0 评论 -
1040 有几个PAT 字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位P第 4 位(A)第 6 位(T)第二个 PAT 是第 3 位(P)第 4 位(A)现给定字符
1040 有几个PAT (25 分)字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位§,第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位§,第 4 位(A),第 6 位(T)。现给定字符串,问一共可以形成多少个 PAT?(题目来源PAT,侵删)输入格式:输入只有一行,包含一个字符串,长度不超过105 ,只包含 P、A、T 三种字母。输出格式:在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结原创 2021-04-18 10:28:12 · 590 阅读 · 0 评论 -
作业比赛编号 : 100000587 - 《算法笔记》4.7小节——算法初步->其他高效技巧与算法 问题 A: 求第k大数
作业比赛编号 : 100000587 - 《算法笔记》4.7小节——算法初步->其他高效技巧与算法 问题 A: 求第k大数答案输出错误解惑:1. 令人不解处:关于第k大的数:例如序列{1,2,3,4,5,6}中第3大的数是4。2. 输出时为:注意参数由此推知题目中所说的第k大为从最大的数开始数,然后依次递减得到第k大的数,例如{1 2 3 4 5 6}中的第1大的数为6,第2大的数为5,第3大的数为4…printf("%d\n",randSelect(a,0,n-1,n-m+1)) ;原创 2021-04-17 21:33:14 · 94 阅读 · 0 评论 -
作业比赛编号 : 100000586 - 《算法笔记》4.6小节——算法初步->two pointers 问题 C: 快速排序 qsort [2*]
作业比赛编号 : 100000586 - 《算法笔记》4.6小节——算法初步->two pointers 问题 C: 快速排序 qsort [2*]代码#include<stdio.h>const int maxn=5005;int partition(int a[],int left,int right){ int temp=a[left]; while(left<right) { while(left<right&原创 2021-04-17 20:33:36 · 70 阅读 · 0 评论 -
作业比赛编号 : 100000586 - 《算法笔记》4.6小节——算法初步->two pointers B基础排序III:归并排序
作业比赛编号 : 100000586 - 《算法笔记》4.6小节——算法初步->two pointers B基础排序III:归并排序#include<stdio.h>void merge(int a[],int l1,int r1,int l2,int r2){ int i=l1; int j=l2; int b[r2-l1+1]; int index=0; while(i<=r1&&j<=r2){原创 2021-04-17 20:17:55 · 92 阅读 · 0 评论 -
快速排序
快速排序思路快速排序分的代码分为两部分:1. 一部分为Partition(int a[],int left,int right) 将区间内的数进行划分,即将大于temp的数放在右侧,小于的放在左侧。仅进行一次划分;int Partition(int a[],int left,int right){ int temp=a[left]; while(left<right){ while(left<right&&a[right]>temp) right--;原创 2021-04-17 15:49:44 · 185 阅读 · 0 评论 -
归并排序(合并排序)
归并排序(合并排序)示意图运用递归将数组一直划分,递归至为两个元素一组终止 ,然后执行合并#include<stdio.h>//将数组a[r1....l1],a[l2....r2],合并; void merge(int a[],int l1,int r1,int l2,int r2){ int i=l1; int j=l2; int k=0; int b[r2-l1+1]; while(i<=r1&&j<=r2){ if(a[i]&l原创 2021-04-17 15:21:50 · 229 阅读 · 0 评论 -
求出序列中第一个大于等于x的元素的位置L以及第一个大于x的元素的位置R,这样x元素在序列中的存在区间就是左闭右开[L,R)
求出序列中第一个大于等于x的元素的位置L以及第一个大于x的元素的位置R,这样x元素在序列中的存在区间就是左闭右开[L,R)代码#include<cstdio>int lower_bound(int A[],int left,int right,int x) //左边界 { int mid; while(left<right) { //跳出循环的条件为left==right,当left==right时意味着找到了唯一的位置 mid=(left+right)/2;原创 2021-04-10 18:06:36 · 416 阅读 · 0 评论 -
木棒切割问题,给出N根木棒,长度已知,现在希望通过分割他们来得到至少K段长度相等的木棒(长度必须为整数),问这些长度相等的木棒最长能有多长
木棒切割问题,给出N根木棒,长度已知,现在希望通过分割他们来得到至少K段长度相等的木棒(长度必须为整数),问这些长度相等的木棒最长能有多长思路:运用二分法,求木棒的最大长度,为求第一个满足某条件的问题,由此联想到求右区间,为最大边界,然后减1即为最大值#include<cstdio>int a[101];//思路:运用二分法int countK(int N,int l){ int k=0; for(int i=0;i<N;i++) k+=a[i]/l; return原创 2021-04-10 18:03:57 · 1016 阅读 · 0 评论 -
装水问题,有一侧面看去是半圆的储水装置,该圆的半径为R,要求往水中装入高度为h的水,使水的面积s1与半圆的面积s2的比例为r ,求h (二分法的应用拓展)
装水问题,有一侧面看去是半圆的储水装置,该圆的半径为R,要求往水中装入高度为h的水,使水的面积s1与半圆的面积s2的比例为r ,求h (二分法的应用拓展)//装水问题,有一侧面为半圆的储水装置,该圆的半径为R,要求往水中装入高度为h的水,使水的面积s1与半圆的面积s2的比例为r ,求h #include<cstdio>#include<cmath>const double eps=1e-5;const double PI=acos(-1.0);double f(doubl原创 2021-04-10 17:19:13 · 216 阅读 · 0 评论 -
问题 C: EXCEL排序 作业比赛编号 : 100000581 - 《算法笔记》4.1小节——算法初步->排序 Codeup
问题 C: EXCEL排序 作业比赛编号 : 100000581 - 《算法笔记》4.1小节——算法初步->排序 Codeup#include<iostream>using namespace std;#include<algorithm>#include<cstring>typedef struct student{ char num[7]; char name[9]; int score;}student;bool cmp原创 2021-03-30 18:32:16 · 117 阅读 · 0 评论 -
Codeup 作业比赛编号 : 100000580 - 《算法笔记》3.6小节——入门模拟->字符串处理 问题 B: 首字母大写对一个字符串中的所有单词,如果单词的首字母不是大写字母,则把单词的首字母
Codeup 作业比赛编号 : 100000580 - 《算法笔记》3.6小节——入门模拟->字符串处理 问题 B: 首字母大写(侵删)注意:gets()函数用来输入一行字符,即遇到换行结束输入,scanf("%s",s)当得到看空格和换行时输入结束代码#include<stdio.h>#include<string.h>int main(){ char s[101]; int i; int len; while(gets(s)) /原创 2021-03-26 18:59:50 · 172 阅读 · 0 评论 -
1017 A除以B本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。
1017 A除以B (20 分)本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。输入格式:输入在一行中依次给出 A 和 B,中间以 1 空格分隔。输出格式:在一行中依次输出 Q 和 R,中间以 1 空格分隔。输入样例 :123456789050987654321 7输出样例 :17636684150141093474 3注:r为余数,q为商代码#include<iostre原创 2021-03-24 20:31:59 · 450 阅读 · 0 评论 -
作业比赛编号 : 100000579 - 《算法笔记》3.5小节——入门模拟->进制转换问题 B: 数制转换
作业比赛编号 : 100000579 - 《算法笔记》3.5小节——入门模拟->进制转换问题 B: 数制转换(题目来源codeup,侵删)注意:输入的字符可能为大写,也可能为小写;进制大于10时,应该应注意sum=sum*a+(s[i]-‘a’+10);,为加10;将10进制转换为b进制时,应该用do… while,具体原因,点击:链接#include<stdio.h>#include<string.h>char s[70];int main(){原创 2021-03-24 20:02:51 · 86 阅读 · 0 评论 -
作业比赛编号 : 100000579 - 《算法笔记》3.5小节——入门模拟->进制转换问题 A: 又一版 A+B
作业比赛编号 : 100000579 - 《算法笔记》3.5小节——入门模拟->进制转换问题 A: 又一版 A+B(题目来源codeup,侵删)注意:1. 用do…while,而不是while,因为当a+b为0是输出的进制值为0,即需要进入循环。2.输入a,b时用long long,而不是int#include<stdio.h> int num[34];int main(){ long long a,b; long long sum; int m;原创 2021-03-24 18:54:34 · 94 阅读 · 0 评论 -
作业比赛编号 : 100000578 - 《算法笔记》3.4小节——入门模拟->日期处理 问题 C: 打印日期
作业比赛编号 : 100000578 - 《算法笔记》3.4小节——入门模拟->日期处理#include<stdio.h>int m[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};bool isLeap(int year){ if(year%400==0||(year%100!=0&&原创 2021-03-21 20:58:54 · 143 阅读 · 0 评论 -
作业比赛编号 : 100000578 - 《算法笔记》3.4小节——入门模拟->日期处理(Codeup)
作业比赛编号 : 100000578 - 《算法笔记》3.4小节——入门模拟->日期处理(Codeup)题目描述有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。输入有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD输出每组数据输出一行,即日期差值样例输入2013010120130105样例输出5注意: 相邻两天的差值为2; 我一直错误这个,没仔细读题#include<stdio.h>bool isLe原创 2021-03-14 20:52:33 · 102 阅读 · 0 评论 -
Codeup 作业比赛编号 : 100000578 - 《算法笔记》3.4小节——入门模拟-> 图形输出 问题 B: Hello World for U
Codeup 作业比赛编号 : 100000578 - 《算法笔记》3.4小节——入门模拟-> 图形输出 问题 B: Hello World for U#include<iostream>using namespace std;#include<string.h>int main(){ char s[80]; int len,side; int i,j; cin>>s; len=strlen(s); side原创 2021-03-12 16:51:03 · 106 阅读 · 0 评论 -
Codeup作业比赛编号 : 100000576 - 《算法笔记》3.2小节——入门模拟->查找元素(题号E)
Codeup作业比赛编号 : 100000576 - 《算法笔记》3.2小节——入门模拟->查找元素(题号E)#include<stdio.h>#define N 20struct Student{ char name[20]; char gender[20]; int age;}stu[N];int main(){ int n; int num; int sum; scanf("%d",&sum); wh原创 2021-03-11 23:18:42 · 108 阅读 · 0 评论 -
作业比赛编号 : 100000576 - 《算法笔记》3.2小节——入门模拟->查找元素D
作业比赛编号 : 100000576 - 《算法笔记》3.2小节——入门模拟->查找元素D错误分析: 总是不习惯使用,导致出错while(scanf("%d",&n)!=EOF){ ... ...}代码#include<stdio.h>int main(){ int m,n; int i,j; while(scanf("%d",&n)!=EOF) { int a[n]; for(i=0;i<n;i+原创 2021-03-11 18:24:29 · 130 阅读 · 0 评论