自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

行步至春深

欢迎你~

  • 博客(69)
  • 收藏
  • 关注

原创 (C++)高精度整数的存储、读入、比较和四则运算

目录1. 存储2. 读入3. 比较大小4. 加法5. 减法6. 高精度整数和低精度整数的乘法7. 高精度整数除以低精度整数高精度整数,又称大整数,其含义就是用基本数据类型无法存储其精度的整数。如:10进制下有着1000个数位的整数。低精度整数,就是可以用基本数据类型存储的整数。1. 存储采用整型数组顺位存储,即整数高位存储在数组高位。为了方便随时获取长度,因此定一个int len和int []组成结构体bign(取自big number)。同时在结构体中使用构

2021-07-31 17:43:24 1585

原创 1096 Consecutive Factors

1. 对于题目描述中list the smallest sequence of the consecutive factors 正确理解是:如果有多组连续因子,输出开头因子最小的那个序列(一开始理解成输出数目最小的那个序列)2. 想象一下这种情况,2*3*4*5 = 120,4*5*6 = 120,如果只遍历不去改变n,那么会最大连续因子是5的错误结果。但是如果一边遍历,一遍除以n,想象这种情况 2*3*5*7,2*3如果得到6的话,最大的连续个数就是3(5*6*7),但由于一开始把2就除掉,因此会得.

2021-07-31 14:30:39 209

原创 1059 Prime Factors

1. 第一次测试点三错误,由于1既不是质数也不是合数,因此对于1来说需要有一个特殊判断,输出:1=1,但是一开始多加了一个等号。2. 本题需要数学基础好,两个重点:(1)会打印某个范围内的素数表(2)知道质因子的存在规律以及怎么表示AC代码#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<bits/stdc++.h>

2021-07-31 10:51:44 92

原创 1078 Hashing

关键在于这句:Quadratic probing (with positive increments only) is used to solve the collisions.开始不懂二次探测,因此做不出来。所谓二次探测就是如果num%mSize被占坑了,就看看(num+1*1)%mSize有没有被占,还是被占,看(num+2*2)%mSize……如果一直到(num+(mSize-1)*(mSize-1))%mSize都被占,说明真的插不进去了。AC代码#include<cstdio&gt

2021-07-31 09:15:22 53

原创 1015 Reversible Primes

1. 这道题因为一上来看到又是进制的转换又是素数的判断,想到自己十进制转化成Q进制的除基取余掌握得并不好,就很紧张,以为要封装一堆函数,然后我也确实这么做了,经过一堆调试(字符和数字之间转化容易忘记),最后得分18/20。2. 然后看别人的博客得到启发,只需要封装一下判断素数的函数,题目给的是十进制数,以及翻转要转化的进制Q。那么首先要把十进制数转化成Q进制,用除基取余法,把每一位的结果存在一个整型数组里,其实得到的刚好是倒序,这样一来反而不用翻转,再直接换算成十进制判断是否是素数即可。3. 另外本

2021-07-30 21:29:20 49

原创 1013 数素数

思路:先写出那个复杂度为O(sqrt(n))的判断是否为素数的函数,然后得出前1万个素数,至于要数到多少个才能达到前一万,我试出来是106000,但是这题给的时间是完全够数到这么多的。注意点:1.存质数的数组prime应该从下标1开始,第一个质数为2。2.存质数的数组不可以刚好设长度为101,因为可能数到106000已经超过了这么多,PTA会报”运行时错误“。AC代码#include<cstdio>#include<cmath>#include<cst

2021-07-30 16:28:15 362

原创 (C++)寻找1-100以内所有素数,复杂度为O(nsqrt(n))与O(nloglogn)的两种方法

注意:1既不是质数也不是合数,2是质数。1. 复杂度为O(nsqrt(n))原理:先写一个判断整数是否为素数的函数,其复杂度为sqrt(n),其原理是对于一个数n,如果它有除了1和自身之外的因子,那么这个因子要么成对出现,一个在(1,sqrt(n)),另一个在(sqrt(n),n)。要么为sqrt(n)。因此只要判断(1,sqrt(n)]范围内有没有因子就好了。判断函数的两种写法如下bool isPrime(int n){ if(n<=1)return false;//特判 f

2021-07-30 15:49:11 1109

原创 1003 我要通过!

1. 总体思路是自己先写写,看看哪些字符串符合,找出规律,然后根据测试用例来矫正。2. 用到了递推的方法,我使用countA[maxn]数组存放截至当前位置一共出现的A的个数。3. 正确的字符串满足的条件是:P之前A的个数×P和T之间A的个数=T之后A的个数 且 PT之间A的个数不为0。要注意PT是不正确的字符串AC代码如下#include<cstdio>#include<cmath>#include<cstring>#include<alg

2021-07-30 14:31:09 102

原创 1049 Counting Ones

1. 这一题起初我用递归的方式,还写了一个数整数有多少个1的函数,OneNum[i] = OneNum[i-1]+countOne(i);毫不意外地出现了段错误,也就是递归调用的次数太多。2. 看了参考书,得到了思路上的启发:给定一个数12,我们可以数从1到12,在个位上和十位上1这个数字各自出现了多少次,然后将二者相加。个位上在1-10中1出现了一次,在11-12中1出现了1次,共2次;十位上在10-12中1出现了3次,3+2=5。如果一个数字还看不出规律,再举一个数123。个位上在1-10中

2021-07-30 10:58:10 146

原创 1034 有理数四则运算

1. 起先,一个用例浮点错误,但是在进入出发之前,明明已经有判断被除数的分子是否为0,另有一个答案错误,但是和书上代码对照,没有区别。题目中说:“题目保证正确的输出中没有超过整型范围的整数”。注意了,这里输出的是化简后,那么化简之前呢?很有可能超过int范围!所以通过搜索键,把用到的int一律换成long long。2. 这道题就是为书上的讲解思路量身定制的(或者说书上是为这道题量身定制的),有以下注意点(1)用结构体来表示有理数(整数是分母为1的有理数),且保证要负也是分子为负,如果分子为0,则分

2021-07-30 08:57:44 258

原创 (C++)一行代码递归实现辗转相除法

定理:两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。int gcd(int a,int b){ return !b?a:gcd(b,a%b);}这里递归边界是gcd(a,0)=a;递归式是gcd(a,b)=gcd(b,a%b);

2021-07-29 18:47:37 874

原创 1008 Elevator

思路如下:用一个整型数组存楼层,0号元素为0(开始停在0层),每读入一个元素,和上一个比较,更大说明是上升,总时长加上楼层差*6,反之说明是下降,总时长加上楼层差*4。最后再管停留时间,也就是所有元素个数*5。#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<bits/stdc++.h>#include<stdlib.h&gt

2021-07-29 15:53:36 54

原创 1093 Count PAT‘s

这题出现在“活用递推”专题下面,所谓递推就是这一步的结果和上一步的结果有直接联系。对于本题来说,从左到右,记到当前位置,一共出现的P的个数,如果当前位置是P,则个数就是上一位的加1,否则等于上一位。#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<bits/stdc++.h>#include<stdlib.h>#inc

2021-07-28 16:38:02 86

原创 1048 Find Coins(two pointers解法)

1. 很典型的双指针的应用,将数组按照非降排列,两个指针从一头一尾开始包抄,若等于(等于要放在第一个)则返回结果结束程序,小于则左指针右移,大于则右指针左移。2. 起初还担心,如果得到的结果不是那个较小数最小的怎么办,其实多虑,从两边逼近,得到的一定是这个结果。3. 比起用散列解决这道题,双指针不用额外考虑两个数相等的情况,因为在序列中相等的两个数指针不一样,不用担心1个数当成两个用。AC代码#include<cstdio>#include<cmath>#inc

2021-07-28 16:07:41 109

原创 1029 Median

1. 开始测试点3和6答案错误,原因是没有考虑到,给的两个数列有可能长度相差很大,某个数列还没到中位数,就结束了。2. 这题的底子是用two pointers按照非递减的顺序合并两个数列,无非是再确定一下中间那个数的下标,一旦达到这个下标就返回结果,结束程序。#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<bits/stdc++.h&

2021-07-28 15:03:56 168

原创 1035 插入与归并

1. 这一题,首先要会插入排序和归并排序的写法。对于归并排序,可以用非递归+sort最简便。把每一趟的结果存进二维数组。2. 单独封装一个函数,比较两个一维数组是否完全一样。3. 由于归并比插入的复杂度低,趟数少,所以先判断归并排序。AC代码#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<bits/stdc++.h>#

2021-07-28 14:25:47 303

原创 (C语言)一种简易记法:生成[a,b]范围内的随机整数

1. 添加头文件#include<stdlib.h>#include<time.h>2. 初始化随机种子srand((unsigned)time(NULL));3. 确定元素个数b-a+1,以及最小元素printf("%d",rand()%(b-a+1)+a);//生成[a,b]之间的数printf("%d",rand()%100+1);//生成[1,100]之间的数printf("%d",rand()%11);//生成[0,10]之间的数...

2021-07-28 10:17:02 1025

原创 (C++)归并排序的递归与非递归实现

递归实现merge函数利用的是双指针技巧降低复杂度。mergeSort函数使用了递归,当中先对左右序列各调用一次mergeSort,再对整个序列调用merge。就按照最浅层的归并的思想去理解,不要大脑走到哪就step in。另外mergeSort进入递归有个left<right的判定容易漏写。#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#i

2021-07-27 20:09:15 1105

原创 1030 完美数列(two pointers解法)

1. 这道题出现在二分法,但是特殊之处在于,双指针是嵌套的,程序看上去有些像暴力枚举,但其实是利用了,如果i<j,a[i]*p>=a[j],那么一定有k在[i,j]范围内,a[i]*p>=a[k],以及a[k]*p>=a[j],那么对于一个比较大的i来说,想获得更大的差值,j是不用比上一个比较小的i得到的j小了。这里的限制关系是双指针降低复杂度的原理。2. 起初困惑为什么外层的while条件已经有了j<n,内层的while还是出现这个条件,是因为在进行内层的循环时,顾不上外

2021-07-27 19:04:06 162

原创 1030 完美数列(二分解法)

1. 将整型序列从小到大排序后,这道题的本质是,对于每一个元素i,找出最后一个满足p*A[i]>=A[j]的元素j,可以转化为找出第一个满足p*A[i]>=A[j]也即p*A[i]<A[j]的元素j。2.LL product = (LL)p*A[i];这里后面两个乘子都是整型,如果不加强制转换,会扣两分。#include<cstdio>#include<cmath>#include<cstring>#include<algorith

2021-07-27 17:09:59 210

原创 1010 Radix

目录总结解题过程总结1. 短小精悍的一道二分算法题,总体思路是,将字符串1(如果tag不是1将两个字符串调换一下即可)转化为10进制,再用二分法看能否找到另一个进制使得两个字符串的10进制数相等。2. 本题的三个函数关系是binarySearch调用cmp,cmp调用getDec,其中getDec是用来吧已知进制的数转化成十进制,但是转化成十进制中有可能会超过LL的范围(字符串一保证不会,虽然题中没说),也就是溢出,会得到负数,如果溢出了说明必然是n2>n1,可以把这种情况和n

2021-07-27 16:00:42 120

原创 (C++)用upper_bound函数取代自己写的二分查找

int a[maxn];int j = upper_bound(a+i+1,a+n,(long long)a[i]*p)-a;以上代码的作用是在a[i+1]~a[n-1]找到第一个大于a[i]*p的数,将其下标返回给j注意:1.函数是左闭右开的2.末尾要减去数组的坐标a3.不加long long强制类型转换可能丢分...

2021-07-26 20:49:39 117

原创 二分法在算法题中的4种常见应用(cont.)

1.查找单调序列中是否存在满足某条件的元素2.寻找序列中第一个(最后一个)满足某条件的元素的位置3.给定一个定义在[L,R]上的单调函数f(x),求方程f(x)=0的根4.装水问题5.木棒切割问题6.快速幂的递归和迭代求法未完待续...

2021-07-26 19:40:05 735

原创 1037 Magic Coupon

1. 贪心算法题,贪心策略:两组乘子相乘,每个数字至多用一次,希望得到最大的乘积。那么让A组绝对值最大的正数和B组最绝对值最大的正数相乘,次大的和次大的相乘……同样的让A组绝对值最大的负数和B组绝对值最大的负数相乘,次大的和次大的相乘,绝不发生正数和负数相乘的情况。0由于对结果没影响,不做考虑。2.具体实施时,在读数据的时候就分别记下A组和B组各自的正数个数、负数个数,相乘时正数和负数分开,取A,B中较小的正数个数作为正数相乘的组数,取A,B中较小的负数个数作为负数相乘的组数。对两个数组进行从大到小排序

2021-07-26 17:04:05 102

原创 1070 Mooncake

1. 一道典型的贪心题,策略是尽可能地多出售单价高的月饼。2. 开始有一个用例没有通过,看了参考书,说是质量虽然给的都是整数,但是为了计算不出错,需要声明为浮点型。改了以后果然就通过了,但是个中原理不清楚。#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<bits/stdc++.h>using namespace std;c

2021-07-26 10:35:25 93

原创 1080 Graduate Admission

1.因为这道题第一次认真想了高考录取的规则,对学生按照先总分再gE的原则进行从高到低排序,排名允许重复。再按照排名高到低对每个学生的每个志愿进行遍历,当一个学生处理完,再进行下一个。2.由于最后是要输出学生的原始序号,但是一旦经过排序,数组下标已经更新一轮,故需要在学生的结构体中加入序号no属性,以方便最后的输出。3.按照排名从小到大遍历过程中,一个学生能被一个志愿学校录取,只有两种情况:(1)该学校还有剩余名额(2)该学校没有剩余名额了,但是该学校录取的最后一名学生和当前学生的排名是一样的

2021-07-26 09:58:56 69

原创 1048 Find Coins(散列解法)

1. 开始测试点3答案错误,看参考书发现是,读题时根据硬币最大面值500设置的数组大小,但是后来会用总面值减去硬币面值,这个大小在[1,999),因此散列表的大小应该设为1010。2. 学会了一个小技巧。main函数可以不止一处return 0。这样就不同写一个布尔型判断是否有解了。3. 另外本题需要考虑到sum = 2*i的情况。因此散列表必须是整型,因为当2个硬币同面值,需要对数量是否达到2进行判断AC代码#include<cstdio>#include<cmath

2021-07-25 17:05:28 195

原创 1005 继续(3n+1)猜想

1. 逆向思维:在分析时,我一直在纠结怎么找到关键数字,可以覆盖其余所有数字。但是看了参考教材,思路是,不被其他数字覆盖的就是关键数字。于是可以开头创建一个布尔型的hashTable,对于数字1~100,开始认为都不是关键数字,初始化为F,随着读入,读到的被认为是关键数字的候选,初始化为T,再接着,由于1~100范围并不大,可以逐一遍历,遇到可能是关键数字的,对齐进行验证,验证过程的所有数字由于被覆盖,皆不是关键数字,再赋值为F。2. 第一次提交测试点4为段错误,看过他人博客,知道是在计算3*p+1时数

2021-07-25 16:23:55 249

原创 1075 PAT Judge

1. 这一题一开始,为了同一个人的数据更新得方便,我把id从字符串转化成整数,作为数组下标,但是注意了,每个学生还是要有字符串的id属性(根据下标得到),因为后面一旦排序,数组下标就毫无意义了。2.由于这里的很多下标都是从1开始,所以一定要注意循环的开始是1,结束要用小于等于符号3.有一个一开始理解错的小点是,当一个人提交了但是编译没通过,该题输出的应该是0分而不是-4.我把结构体中每道题的得分初始化为-2,是为了方便最后判断考生该题有没有提交AC代码#include<cstdi

2021-07-22 20:02:44 104 2

原创 1055 The World‘s Richest

开始的做法是,对于每一个case,都在整个person数组内进行遍历,把所有年龄符合要求的都放进一个临时数组,然后对临时数组进行排序,再根据要求的数目输出。但是这么做会有一个测试用例因为超时而通不过。穷则思变。于是改成读入全部数据之后对完整的数组进行排序,之后不再排序。对于每一个case,设置两个变量idx,hasOut,上限分别是全部数据的数量和要求输出的数量,对全部数组进行遍历输出,二者中的任何一个达到上限即停止。注意:idx是每一轮都会自增,hasOut只有在输出一条信息时才自增。AC代码

2021-07-22 09:18:06 62

原创 1041 Be Unique

1.依旧是散列题,开一个整形的哈希数组bets[10010]来计数,最后数目为1的,也就是unique2.注意,可能为1的不止一个,要输出第一个输入的unique,那么需要记录下读入的顺序,可以开辟一个数组inputs[100010]来记录,最后不是按照哈希数组的下标来遍历,而是按照Inputs的下标来遍历,这样才能保证最先读入的unique被输出AC代码#include<cstdio>#include<cmath>#include<cstring>#

2021-07-21 19:33:52 191

原创 1043 输出PATest

开一个长度为6的整型数组分别记录6个字符的数量,输出的时候条件是数组中至少存在一个不为零的元素while(PATest[0]||PATest[1]||PATest[2]||PATest[3]||PATest[4]||PATest[5]){//当6个还有一个不为0 AC代码#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<bits/

2021-07-21 17:34:37 146

原创 1042 字符统计

1. 发生了两次强制类型转换,第一次是将字符作为数组下标,char->int,第二次是最后记录那个出现次数最多的字符的下标,然后直接输出整数,但是printf用的是%c,int->char2.hashTable[str[i]] 这里面有个嵌套,很容易迷惑,要想清楚用哪个数组和哪个下标AC代码#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#.

2021-07-21 17:09:57 53

原创 1039 到底买不买

很典型的散列题,对于shop和eva有的珠子(即字符),各开一个128长度的整形散列表计数,将字符作为下标读入。然后从0~127进行遍历,看每个下标下两个散列表的数量,如果有shop<eva说明不买,但是遍历仍然要继续,因为最后要输出所缺珠子的总数。可以在遍历前设置一个布尔变量isEnough看珠子够不够,设置一个整形变量lessNum计算缺少珠子的数量。如果最后不买,输出lessNum,如果买,那么商店珠子长度减去伊娃珠子长度即为多出的珠子数量。AC代码#include<cs

2021-07-21 16:41:33 52

原创 1033 旧键盘打字

1. 非常奇怪,明明都说了用下划线替代空格,但是用scanf读入的时候就会有1个测试点没通过,换成cin.getline就通过了2.3种情况下对应的哈希表赋值为true。1是上来就赋值,2是对于大写字母把对应小写字母也赋值,这里注意直接在字符上+32,3是上档键坏了,下标从65~90都要赋值。AC代码如下#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#

2021-07-21 10:39:41 53

原创 1084 Broken Keyboard

两个注意的点1.本题被归到散列专题下,但是由于是逐字符地映射到整形,可以直接把布尔型哈希数组的大小设置为ASCII的数量128,然后直接将字符作为数组下标(如果是字符串,才需要自己写一个哈希函数,将字符串映射到整形,对于本题是不需要的,多此一举使得代码复杂更容易出错)2.其次是输出的时候,就算是小写字母的键盘坏了,也输出大写字母,那么小写字母什么时候转化成大写字母(即减去32)就很重要。如果在判断字母有无出现之前,就转换,那么就错了。因为a没出现过,A出现过的时候,就会漏掉输出。以下是AC代码

2021-07-21 10:14:17 75

原创 1016 Phone Bills

1. 怎样比较时间先后:由于时间是以01:01:06:01月:日:时:分的形式从大到小排列的字符串,所以在cmp中写strcmp即可。2. 怎样得到一对时间,对于每一个人按照时间排好顺序的记录,判断本条是否状态为在线且下条状态为离线,注意,由于相等时strcmp返回的是0,要记得加取反符号if(!strcmp(recs[i][j].state,"on-line")&&!strcmp(recs[i][j+1].state,"off-line"))...

2021-07-20 23:44:26 76 1

原创 1012 The Best Rank

思路:读入全部的数据之后,按照四个cmp函数对数组进行排序,给每生的4个科目赋值,读入要检验的id后使用strcmp对数组中的id进行遍历(幸好这里数组大小和要检验的数目乘积不超过4万),如果找到了相同id,调用写好的得到bestRank的函数进行输出即可,没找到就输出“N\A”#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<bits/s

2021-07-20 10:28:34 169

原创 1062 Talent and Virtue

1.在结构体里面设置total_grades属性是明智之举,但是不可以在结构体内得到total_grades=virtue_grade+talent_grade;2.弄清题意,对人进行分类,等级越高type值越小,但是注意分的类别也许出现交叉的情况,细的要出现在粗的之后3.尤其注意要被淘汰的选手,一旦淘汰要直接进入下一轮循环,否则可能因为type被覆盖而被误捞回来。例如:60分的最低分,有人v=90,t=50,本该淘汰,却可能被接下来的判断认为是君子#include<cstdio>

2021-07-19 21:19:51 82

原创 1025 PAT Ranking

1. 考生的编号是数字字符串,但是没必要转化成整数再比较,可以直接用strcmp()2. 对整体的排名进行编号时所有信息都已经齐备,可以边编号边输出3. 需要有些思量的地方是部分编号,当当前学生的分数不等于他上一个该怎么办4. 真的需要int final_rank这个属性吗?可以不用的,因为它的输出是紧接着得到5. 在用scanf读入的时候千万注意除了字符数组都要加&,否则容易出现少读或者段错误#include<cstdio>#include<cmath&g

2021-07-19 11:10:07 61

空空如也

空空如也

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

TA关注的人

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