02 2021 档案
摘要:题意 在微博中,每个用户都可能被若千个其他用户关注。而当该用户发布一条信息时,他的关注者就可以看到这条信息并选择是否转发它,且转发的信息也可以被转发者的关注者再次转发,但同一用户最多只转发该信息一次(信息的最初发布者不会转发该信息)。现在给出N个用户的关注情况( 即他们各自关注了哪些用户)以及一个转
阅读全文
摘要:水~。 题意 给定一棵二叉查找树(BST)的插入序列,求这棵二叉查找树的最下面两层的结点个数并求和。 注意点 与根结点相同的结点应当插到左子树中。 const int N=1010; PII tree[N]; int a[N]; int dep[N],maxdep; int cnt[N]; int
阅读全文
摘要:题意 有N个人,每个人喜欢若干项活动,如果两个人有任意一个活动相同,那么就称他们处于同一个社交网络(若A和B属于同一个社交网络,B和C属于同一个社交网络,那么A、B、C属于同一个社交网络)。求这N个人总共形成了多少个社交网络。 思路 如果A和B是好朋友,并且B和C是好朋友,那么A和C也是好朋友。本题
阅读全文
摘要:水~,和1064 Complete Binary Search Tree (30 分)类似。 题意 二叉树有N个结点(结点编号为0 ~ N-1),给出每个结点的左右孩子结点的编号(不存在用-1表示)。接着给出一个N个整数的序列,需要把这N个整数填入二叉树的结点中,使得二叉树成为一棵二叉查找树。输出这
阅读全文
摘要:题意 给出N个非负整数,要用它们构建一棵完全二 叉排序树。输出这棵完全二叉排序树的层序遍历序列。 思路 如果使用数组来存放完全二叉树,那么对完全二叉树当中的任何一个结点(设编号为x,其中根结点编号为1),其左孩子结点的编号一定是2x,而右孩子结点的编号一定是2x+1。那么就可以开一个数组tree[m
阅读全文
摘要:1079 Total Sales of Supply Chain (25 分)几乎一模一样的题,没啥新意。 题意 给出一棵销售供应的树,树根唯一。在树根处货物的价格为P,然后从根结点开始每往子结点走一层, 该层的货物价格将会在父亲结点的价格上增加r%。求叶子结点处能获得的最低价格以及能提供最低价格的
阅读全文
摘要:水~。 题意 输入树的结点个数N (结点编号为1~N)、非叶子结点个数M,然后输入M个非叶子结点各自的孩子结点编号,求结点个数最多的一层(层号是从整体来看的,根结点层号为1),输出该层的结点个数以及层号。 const int N=110; vector<int> g[N]; int cnt[N];
阅读全文
摘要:水~。 题意 给出一棵销售供应的树,树根唯一。在树根处货物的价格为P,然后从根结点开始每往子结点走一层,该层的货物价格将会在父亲结点的价格上增加r%。求所有叶结点中的最高价格以及这个价格的叶结点个数。 1079 Total Sales of Supply Chain (25 分)的简化题。 cons
阅读全文
摘要:水~。 题意 给出一棵销售供应的树,树根唯一。在树根处货物的价格为P,然后从根结点开始每往子结点走一层,该层的货物价格将会在父亲结点的价格上增加r%。给出每个叶结点的货物量,求它们的价格之和。 注意点 输入中,如果为0,则表示该结点为叶结点,后面跟的数字为该叶结点的货物量;如果不
阅读全文
摘要:P1631 序列合并是时的简化问题,回到本题,我们可以先求出前序列中任取一个数相加构成的前小和,把这个和作为一个序列,再与第个序列求新的前小和,以此类推,最终得到个序列任取一个数相加构成的前小和。整个算法的时间复杂度为 注意点
阅读全文
摘要:首先,把A和B两个序列分别从小到大排序,变成两个有序队列。这样,从A和B中各任取一个数相加得到N2个和,可以把这些和看成形成了n个有序表/队列: A[1]+B[1] ⇐ A[1]+B[2] ⇐ … ⇐ A[1]+B[N] A[2]+B[1] ⇐ A[2]+B[2] ⇐ … ⇐ A[2]+B[N] …
阅读全文
摘要:题意 给定一棵二叉树,判断其是否为完全二叉树。如果是的话,同时输出该完全二叉树的最后一个结点编号;否则输出二叉树的根结点编号。 我的思路: 先判断最后一层上面的层是否是满的,最后判断最后一层的结点是否都在最左边。 注意点 一定要注意节点编号可能是两位数,不能用char类型存储。 const int
阅读全文
摘要:水~。 ,结点下标的范围为,所以直接和字符'0'相减即可。 const int N=35; PII tree[N]; int fa[N]; vector<int> layer,in; int n; void bfs(int root) { queue<in
阅读全文
摘要:参考代码,虽然自己思路大体上相同,但离代码实现还差一步,菜的安详>_<。 思路 题意其实就是下面的伪代码: void inorder(int root) { if(root == 0) return; push(root); inorder(tree[root].lchild); p
阅读全文
摘要:在二叉搜索树中,中序遍历的结果总是所有元素的升序排列(如上表中标红的一行所示);换句话说,中序遍历结果是不能帮助我们判断两个序列是否对应同一棵二叉搜索树的。这是其他几种遍历无法做到的。 而层序、先序、后序遍历都可以用来判断两个给定序列是否为同一棵二叉搜索树。 const int N=110; str
阅读全文
摘要:二叉排序树裸题。 牛客网补充说明:输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出。 所以建立的二叉排序树中不包含重复元素。 const int N=110; int a[N]; PII tree[N]; int n; void insert(int &root,int idx) {
阅读全文
摘要:题意 给定一个整数序列,判断它是否可能是某个二叉搜索树或其镜像进行前序遍历的结果。对镜像树的先序遍历只需要在原树的先序遍历时交换左右子树的访问顺序即可。 注意点 结点中存放的是下标。 使用vector来存放初始序列、先序序列、镜像树先序序列,可以方便相互之间的比较。 由于结点的值会有重复,不能采用m
阅读全文
摘要:并查集裸题,注意的特判,此时没有朋友关系,房间里只能留下一个人,其余都要移出去。 const int N=1e7+10; int p[N]; int cnt[N]; int n,m; int find(int x) { if(x != p[x]) p[x]=find(p
阅读全文
摘要:题目关键就是要保证两个点 这是一张无环图 这张图是一张连通图 这就变成一个并查集的模板题,每次加进来一条边只要判断两个顶点的根节点是否相同,如果相同说明遇到了环。然后判断这张图是连通图块数是否为1。 const int N=1010; int p[N]; int n,m; int find(int
阅读全文
摘要:读懂题后发现,这不就三维裸题吗,分的裸题可还行。 输入数据时是按多个二维矩阵的方式读入的,因此3层for循环中的第一层需要遍历矩阵编号,第二、三层才是单个矩阵的数据读入。 const int N=1300,M=130; struct Node { int x,y,z; }; boo
阅读全文
摘要:解法一: 每次扩展的状态有个。宽搜多写写还是有好处的。 const int N=110; struct Node { int ca,cb; int dist; string path; }; bool vis[N][N]; string op[]={"FILL(1)","FILL
阅读全文
摘要:不是很难吧,分的题。 和1053 Path of Equal Weight (30 分)类似,毕竟都是,^_^。 题意 给定正整数N、K、P,将N表示成K个正整数(可以相同,递减排列)的P次方的和,即,如果有多种方案,那么选择底数和$
阅读全文
摘要:分水了啊。 题意 给定一棵树和每个结点的权值,求所有从根结点到叶子结点的路径,使得每条路径上结点的权值之和等于给定的常数S。如果有多条这样的路径,按路径非递增的顺序输出。 其中路径的大小是指,如果两条路径分别为与$b_1→b_2→\cdots→
阅读全文
摘要:题意 编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。 思路 添加#字符后构成完全二叉树。 c
阅读全文
摘要:题意 给定 1 ~ N 这 N 个整数和一个无限大的栈,每个数都要进栈并出栈一次。如果进栈的顺序为 1,2,...,N,那么可能的出栈序列有多少种? 思路 面对任何一个状态我们只有两种选择: 把下一个数进展 把当前栈顶的数出栈(如果栈非空)。 const int N=25; int stk[N],t
阅读全文
摘要:题意 给出NP只老鼠的质量,并给出它们的初始顺序,按这个初始顺序把这些老鼠按每NG只分为一组,最后不够NG只的也单独分为一组。对每组老鼠,选出它们中质量最大的1只晋级,这样晋级的老鼠数就等于该轮分组的组数。对这些晋级的老鼠再按上面的步骤每NG只分为一组进行比较,选出质量最大的一批继续晋级,这样直到最
阅读全文
摘要:经典的括号匹配问题。 遇到匹配的括号则出栈,否则匹配失败退出循环,最后若没有匹配失败的情况且栈为空输出yes,否则输出no。 map<char,char> mp; int main() { mp['(']=')'; mp['[']=']'; mp['{']='}'; int T; cin>>T; w
阅读全文
摘要:最基础的题了吧。 题意 有一个容量限制为M的栈,先分别把依次入栈,并给出一系列出栈顺序,问这些出栈顺序是否可能。 思路 解决本题的基本思路是:按照题目的要求进行模拟,将1 ~ n依次入栈,在入栈的过程中如果入栈的元素恰好等于出栈序列当前等待出栈的元素,那么就让栈顶元素出栈,
阅读全文
摘要:水。 题意 给出N本书的编号、书名、作者、关键词(可能有多个)、出版社及出版年份,并给出M个查询,每个查询给出书名、作者、关键词(单个)、出版社及出版年份中的一个,要求输出满足该给出信息的所有书的编号。 map<string,set<string>> mp[6]; int n,m; int main
阅读全文
摘要:水~。 map<int,int> mp; int n,m; int main() { cin>>m>>n; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { int color; cin>>color; mp[color]++; } for(auto t:mp)
阅读全文
摘要:set水题~。 set<int> S; int n; int main() { cin>>n; for(int i=0;i<n;i++) { string s; cin>>s; int sum=0; for(int i=0;i<s.size();i++) sum+=(s[i]-'0'); S.ins
阅读全文
摘要:以字符串形式输入每个数,然后分别判断是否合法,不合法时输出错误信息,合法时对其进行累加,最后输出平均数。 判断是否合法的过程: (1) 如果字符串以负号'-'开头,那么先把它去掉,去掉后如果字符串长度为0,那么直接认为不合法(虽然数据里似乎没有只存在负号的字符串); (2) 使用一个变量 dotPo
阅读全文
摘要:各种乱搞过的=_=。 string mp[2][13]={ {"tret","jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"}, {"","tam","hel","maa&qu
阅读全文
摘要:水题~。 当出现给定字符串已经是回文串时,不需要对其进行操作,输出原数与0。 const int N=1010; string s; int k; bool check(string s) { for(int i=0;i<s.size()/2;i++) if(s[i] != s[s.size()-1
阅读全文
摘要:高精除低精板子题。 const int N=1010; struct bignum { int m[N]; int len; bignum() { memset(m,0,sizeof m); len=0; } }; int r; bignum Div(bignum a,int b) { bignum
阅读全文
摘要:水题~。 unordered_map<string,string> mp; unordered_set<string> S; int n,m; bool isprime(int n) { for(int i=2;i*i<=n;i++) if(n % i == 0) return false; ret
阅读全文
摘要:题意 给出一个正整数N,求一段连续的整数,使得N能被这段连续整数的乘积整除。如果有多个方案,输出连续整数个数最多的方案;如果还有多种方案,输出其中第一个数最小的方案。 思路 首先需要注意到的一点是,N不会被除自己以外的大于的整数整除,因此只需要从2 ~ N遍历连续整数的第一个,求此时N
阅读全文
摘要:简单模拟~。 int a[35]; int score[35]; int n; int main() { int sum=0; while(cin>>a[n],a[n]) { if(a[n] == 1) score[n]=1; else if(n==0 || a[n-1] == 1) score[n
阅读全文
摘要:题意 给出散列表长TSize和欲插入的元素,将这些元素按读入的顺序插入散列表中,其中散列函数为H(key) = key % TSize,解决冲突采用只往正向增加的二次探查法(即二次方探查法)。 另外,如果题目给出的TSize不是素数,那么需要将TSize重新赋值为第一个比TSize大的素数再进行元素
阅读全文
摘要:水~。 const int N=1e5+10; int primes[N],cnt; bool vis[N]; int n; void init(int n) { for(int i=2;i<=n;i++) if(!vis[i]) { primes[cnt++]=i; for(int j=i;j<=
阅读全文
摘要:题意 给出n个分数,求分数的和。分数前面可能有负号。若答案为假分数,则要按照带分数的形式输出;整数则按整数输出;否则按真分数输出。 注意点 注意最后输出时,需要按整数、带分数、真分数的情况分类处理。 注意最终结果为0的处理。 必须在每一步加法后都进行约分,如果等全部加完后才约分,则会溢出。 计算最大
阅读全文
摘要:模拟题~。 题意 N个人排成K排来照相,规则如下: (1) 除了最后一排(个子最高的那排)外,其余所有排的人数均为N/K (向下取整)。, (2) 后排所有人的身高都大于前排所有人的身高。 (3) 对每一排来说,最高的人站在中间;在此基础上,该排的其他人按照左右交替的方式排在中间的人的两侧,例如中间
阅读全文
摘要:状态表示: :当前为len位,已经统计的的个数为cnt,不计前导。 注意点: 由于前导标识符lead的存在,如果左边界为需要作加一处理。 LL f[15][15]; int a[15]; LL dfs(int len,int cnt,bool l
阅读全文
摘要:本题求一个数包含49的个数,典型数位DP问题。 状态表示::当前为第len位,当前已统计的数字的状态为state。 其中,state有三种值: state == 1,表示上一位为4 state == 2,表示高位已存在49 state == 0,其他情
阅读全文
摘要:数位DP模板题。 状态表示: :表示当前为len位,且当前已统计的的个数为cnt个。 注意点: 一开始把数组表示成一维了,实际上搜索时每层的状态是个三维向量,limit可以不记录在数组中,但len和cnt是一定要记录在数组当
阅读全文
摘要:状态表示: dp[len][sta]表示当前第len位,上一位为last的情况下满足条件的数的个数。 int f[15][10]; int a[15]; int l,r; int dfs(int len,int last,bool limit) { if(!len) return 1; if(!li
阅读全文
摘要:找规律。 const int N=1e5+10; long double a[N]; long double sum[N]; int n; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; a[i]+=a[i-1]; } for(int
阅读全文
摘要:题意 题目给出一个字符串,可能有P、A、T或其他字符。现在需要根据以下几个条件来判断该字符串能否输出“YES”。 条件1:如果出现P、A、T以外的字符,输出“NO”;初始状态下P和T必须各恰好有一个,且P在T左边,P和T之间至少有一个A,否则输出“NO”。 条件2:PAT、APATA、AAPATAA
阅读全文
摘要:水~。 题意 给定一个由整数组成的集合,集合中的整数各不相同,现在要将它分为两个子集合,使得这两个子集合的并为原集合、交为空集,同时在两个子集合的元素个数n1与n2之差的绝对值|n1-n2|尽可能小的前提下,要求它们各自的元素之和S1与S2之差的绝对值|S1-S2|尽可能大。 思路 首先可以注意到,
阅读全文
摘要:题意 本题输入一个序列,包含N个正整数,如果一个数左边的所有数都比它小、右边的所有数都比它大,那么称这个数为序列的一个“主元”。求序列中主元的个数。 思路 直接暴力判断会超时。 考虑大小的继承关系,假设序列为A,令数组leftMax记录序列A的每一位左边的最大数(含本位,下同),即leftMax[i
阅读全文
摘要:题意 给出两个已经递增的序列S1和S2,长度分别为N和M,求将它们合并成一个新的递增序列后的中位数(个数为偶数时为左半部分的最后一个数)。 思路 由于在给定两个子序列的长度N和M后,新序列的长度N+M就是已知的,因此中位数的位置为(N+M-1)/2(此处为向下取整)。 令计数器count初始为0,表
阅读全文
摘要:题意 给出一个初始序列,可以将它使用插入排序或归并排序进行排序。现在给出一个序列,问它是由插入排序还是归并排序产生的,并输出下一步将会产生的序列。 思路 本题需要直接模拟插入排序和归并排序的每一步过程,其中归并排序使用非递归形式会更方便一些。整体做法为:先进行插入排序,如果执行过程中发现与给定序列吻
阅读全文
摘要:题意 给出一个数字序列与一个数S,在数字序列中求出所有和值为S的连续子序列(区间下标左端点小的先输出,左端点相同时右端点小的先输出)。若没有这样的序列,求出和值恰好大于S的子序列(即在所有和值大于S的子序列中和值最接近S)。假设序列下标从1开始。 思路 令Sum[i]表示A[1]到A[j]的和值,即
阅读全文
摘要:题意 给定一个正整数数对N1,N2,并给出其中一个数字的进制,请你求出另一个数字在什么进制下,两数相等成立。如果答案不唯一,则输出最小的进制数。 范围:N1和N2均不超过10个数位,且每个数位均为0 ~ 9或a ~ z,其中0 ~ 9表示数字0 ~ 9、a ~ z表示数字10 ~ 35。 思路 将已
阅读全文
摘要:题目给出的是中缀表达式,所以要计算它的值主要是两个步骤: 中缀表达式转后缀表达式。 计算后缀表达式。 下面分别讲一下这两步。 中缀表达式转后缀表达式 ①设立一个操作符栈,用以临时存放操作符;设立一个数组或者队列,用以存放后缀表达式。 ②从左至右扫描中缀表达式,如果碰到操作数(注意:操作数可能不止一位
阅读全文
摘要:题意 从N个正整数中选择若千个数,使得选出的这些数中的最大值不超过最小值的p倍。问满足条件的选择方案中,选出的数的最大个数。 思路 由于题干中涉及序列的最大值和最小值,因此不妨先将所有N个正整数从小到大进行排序。在此基础上证明:能使选出的数个数最大的方案,一定是在该递增序列中选择连续的若千个数的方案
阅读全文
摘要:这个题给分也太拉了。 题意 给出若干可能有前导零的数字串,将它们按某个顺序拼接,使生成的数最小。 思路 很多读者看了样例,会觉得只要把这些数字串按字典序从小到大排序,然后按顺序输出就可以了。这种想法方向似乎是对的。但是来看样例中的例子: {“32”,“321”},排序结果是{“32”,“32
阅读全文
摘要:题意 给出的一个序列,要求通过两两交换的方式将其变为递增序列,但是规定每次只能用0与其他数进行交换。求最小交换次数。 思路 由于必须使用数字0跟其他数进行交换,因此直观上可以很容易想到的策略是:如果数字0当前在i号位,则找到数字i当前所处的位置,然后把0与i进行交
阅读全文
摘要:水题~。 魔鬼变量名。 vector<int> positive_coupon,negative_coupon; vector<int> positive_product,negative_product; int nc,np; int main() { cin>>nc; for(int i=0;i
阅读全文
摘要:题意 已知起点与终点的距离为D,油箱的最大油量为Cmax,单位汽油能够支持前进Davg。给定N个加油站的单位油价和离起点的距离(所有加油站都在一条线上),汽车初始时刻处于起点位置,油箱为空,且可以在任意加油站购买任意量的汽油(前提是不超过油箱容量),求从起点到终点的最小花费。如果无法到达终点,则输出
阅读全文
摘要:注意对全为孤立点的情况进行处理。 const int N=1e5+10; set<int> node; vector<int> g[N]; int din[N]; bool vis[N]; vector<int> res; int n; void bfs(int st) { priority_que
阅读全文
摘要:注意特判max可能在a[0]位置,此时调换最小值后最大值下标会不准确,需要将最大值下标更新为上一步交换后的下标。 int a[10]; int main() { string line; while(getline(cin,line)) { stringstream ss(line); int mi
阅读全文
摘要:水题~。 const int N=1e5+10; map<int,int> mp; bool vis[N]; int a[10010]; int n,m; int main() { cin>>n; for(int i=0;i<n;i++) { int a,b; cin>>a>>b; mp[a]=b,
阅读全文
摘要:太菜了,面对一个分的题乱搞许久。 题意 键盘上有一些键位坏了,当按一次这些键时,都会固定输出k次这些字符。现在告诉你k的值,以及最终输出的字符串,输出可能坏的键位和原始字符串。 思路 由于坏的键位每按一次就会出现k个重复键位,因此对任何一个键位,只要它在字符串中每次连续出现的长度都是k的整数
阅读全文
摘要:一眼二分。 二分左边界应该取而不能取数组中最小值(起码是最小值减,因为要求严格大于的天数),右边界由题目得为。 const int N=1e5+10; int a[N]; int n; bool check(int x) { int cnt=0; for(int i=0
阅读全文
摘要:这不双指针板子题吗🎈。 const int N=1e5+10; int a[N]; int n,m; int main() { cin>>n>>m; for(int i=0;i<n;i++) cin>>a[i]; sort(a,a+n); int l=0,r=n-1; bool ok=false;
阅读全文
摘要:对输入的每一个数,进行3n+1猜想的操作,对其中经过的每一个数x,插入集合中表示x被覆盖。 记录关键数,并从大到小排序,最后输出即可。 const int N=110; int a[N]; set<int> S; int n; int main() { cin>>n; for(int i=0;i<n
阅读全文
摘要:水~。 map<int,int> mp; int n; int main() { cin>>n; for(int i=0;i<n;i++) { int team_id,player_id,grade; scanf("%d-%d %d",&team_id,&player_id,&grade); mp[
阅读全文
摘要:既然要按PATest的顺序输出,那么就开一个数组cnt[6], 用来记录六个字符分别出现的个数(同时用一个变量tot记录总个数)。这样在读入字符串之后,就可以直接统计出这个数组。 遍历cnt数组,如果cnt[j]不为0,那么输出dict[i],并让cnt[i]减1、sum减1。如果sum变为0,那么
阅读全文
摘要:水~。 map<char,int> mp; int main() { string s; getline(cin,s); for(auto t:s) if(isalpha(t)) mp[tolower(t)]++; char c='a'; for(auto t:mp) if(t.se > mp[c]
阅读全文
摘要:水题~。 注意:商店每串珠子都不拆开售卖,只能整串购买。 map<char,int> mpa,mpb; string a,b; int main() { cin>>a>>b; for(auto t:a) mpa[t]++; for(auto t:b) mpb[t]++; int buy=0,miss
阅读全文
摘要:水题。 int cnt[105]; int n,m; int main() { cin>>n; for(int i=0;i<n;i++) { int x; cin>>x; cnt[x]++; } cin>>m; for(int i=0;i<m;i++) { int x; cin>>x; if(i)
阅读全文
摘要:兄弟题1084 Broken Keyboard (20 分),一样的水~。 ps:`当按键都没坏的时候,输入可能为空,要用getline而不能用cin。 bool vis[200]; string a,b; int main() { getline(cin,a); getline(cin,b); f
阅读全文
摘要:水题~。 set<char> S; set<char> res; string a,b; int main() { cin>>a>>b; for(auto t:b) { t=toupper(t); S.insert(t); } for(auto t:a) { t=toupper(t); if(S.c
阅读全文
摘要:屑题。 题意 给出两个数,将它们写成保留N位小数的科学计数法后是否相等。如果相等,则输出YES,并给出该转换结果;如果不相等,则输出NO,并分别给出两个数的转换结果。 题目的要求是将两个数改写为科学计数法的形式,然后判断它们是否相等。而科学计数法的写法一定是如下格式:$0.a_1a_2a_3 \cd
阅读全文
摘要:原代码,在上能取得的满分好成绩,但在其他地方都超时了,gg。 set<int> S[55]; double res[55][55]; int n,m; void init() { for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++)
阅读全文
摘要:兄弟题1039 Course List for Student (25 分),一样很水。 vector<string> course[2510]; int n,m; int main() { cin>>n>>m; for(int i=0;i<n;i++) { string name; name.re
阅读全文
摘要:水题,用c++读入最后一个点会超时。 const int N=40010; map<string,vector<int>> mp; int n,m; int main() { cin>>n>>m; while(m--) { int course,k; scanf("%d%d",&course,&k)
阅读全文
摘要:带模拟。 题意 给出N条记录,每条记录给出一辆车的车牌号、当前时刻以及出入校情况(入校(in)还是出校(out))。然后给出K个查询,每个查询给出一个时刻,输出在这个时刻校园内的车辆数。 查询完毕后输出在学校内停留时间最长的车辆的车牌号(如果有多个,就一并输出)和对应的停留时间。 注意: 每个 in
阅读全文
摘要:带模拟,但不算太难,感觉给分水了。 对于每位考生的每个志愿学校,如果当前志愿学校的招生人数未达到该校招生人数总额度或该校上一个录取考生的排名与该考生的排名相同,则不受招生人数限制,破格录取该考生。 对每个学校,将其录取考生按编号从小到大排序,并按学校的顺序输出录取考生的编号。 排序要按双关键
阅读全文
摘要:大水题。。。完全没有分题的样子。。。 struct Node { string name; string id; int grade; bool operator<(const Node &W) const { return grade > W.grade; } }; vector<Node
阅读全文
摘要:带模拟。 题意 有N位考生,共有K道题,且每道题的分值给出。然后给出M次提交记录,每个提交记录显示了该次提交所属考生的准考证号、交题的题号及所得的分值,其中分值要么是-1 (表示未通过编译),要么是0到该题满分区间的一个整数。现在要求对所有考生按下面的规则排序: 先按K道题所得总分从高到低排序。 若
阅读全文
摘要:高精度进制转换,挺无聊的这种题,非要写个麻烦的高精度。 const int N=110; struct bignum { int m[N]; int len; bignum() { memset(m,0,sizeof m); len=0; } }; int ra,rb; string a; int
阅读全文
摘要:先将整数部分和小数部分对齐,后面就跟高精度加法类似思路了,最后将末尾多余的零删除。 string sa,sb; int main() { int T; cin>>T; while(T--) { cin>>sa>>sb; int posa=sa.find('.'),posb=sb.find('.');
阅读全文
摘要:,求,考察高精度乘法。 const int N=3010; struct bignum { int m[N]; int len; bignum() { memset(m,0,sizeof m); len=0; } }; int n; bignum mu
阅读全文
摘要:题意 给出个人的姓名、年龄及其拥有的财富值,然后进行K次查询。每次查询要求输出年龄范围在[AgeL, AgeR]的财富值从大到小的前M人的信息。如果财富值相同,则年龄小的优先;如果年龄也相同,则姓名的字典序小的优先。 暴力代码,水了。 const int N=1e5+10; st
阅读全文
摘要:大水题。。。 const int N=1e5+10; struct Node { string id; string name; int grade; }a[N]; int n,m; bool cmp1(Node &a,Node &b) { return a.id < b.id; } bool cm
阅读全文
摘要:水题~。 struct Node { string id; int virtue,talent; int total; bool operator<(const Node &W) const { if(total == W.total) { if(virtue == W.virtue) return
阅读全文
摘要:一眼二分。 注意点: 在读入n之后要使用getchar接收后面的换行符,否则会使for循环内的getline读入这个换行符,导致第一个字符串读取错误。 最后输出答案前要先check一遍 const int N=110; string a[N]; string suffix; int n; bool
阅读全文
摘要:水题~。 map<char,char> mp; int n; void init() { mp['1']='@'; mp['0']='%'; mp['l']='L'; mp['O']='o'; } int main() { init(); cin>>n; vector<pair<string,str
阅读全文
摘要:采用试除法求约数,注意对的特判。 int n; bool check(int n) { int res=1; for(int i=2;i*i<=n;i++) if(n % i == 0) { res+=i; if(i != n/i) res+=n/i; } return res==n; } i
阅读全文
摘要:试除法求约数。 int check(int n) { int res=1; for(int i=2;i*i<=n;i++) if(n % i == 0) { res+=i; if(i != n/i) res+=n/i; } return res; } int main() { vector<int>
阅读全文
摘要:试除法求约数个数。 int n; int divisor(int n) { int res=0; for(int i=1;i*i<=n;i++) if(n % i == 0) { res++; if(i != n/i) res++; } return res; } int main() { whil
阅读全文
摘要:分解质因数裸题,注意对特判下,为什么还要分解质因数啊喂,迷惑行为-_-。 PII fac[10]; int n; int cnt; void divide(int n) { for(int i=2;i*i<=n;i++) if(n % i == 0) { fac[cnt].fi=i; w
阅读全文
摘要:对AB的长度不一致处理时不能用swap()函数,必须分情况单独处理,因为偶数位要求用B的数字减去A的数字,交换AB会导致减法次序错误。 string a,b; char mp[]={'J','Q','K'}; char trans(int x) { if(x<10) return '0'+x; el
阅读全文
摘要:参考的代码,感觉写法有些秒。 主要思想是定位字母E的位置,然后就可以很容易识别左边小数的终止位置和右边指数的正负号和绝对值exp。在定位字母E的位置pos后,按指数正负分两种情况讨论: 指数为负:应该注意到,这种情况一定是输出0.00...0XXX,其中小数点后连续的0的个数为exp
阅读全文
摘要:wdnmd真就阅读理解啊,读了好几发并且rush了几发才算真正读懂题>_<。 题意 给出4个字符串,其中前两个字符串包含两个信息:DAY和HH,后两个包含一个信息:MM。 下面给出这个信息的识别信息和转换关系: DAY:前两个字符串的第一对相同位置的A ~ G的大写字母。 转换关系:大写字母是从A开
阅读全文
摘要:水题~。 int main() { string s; getline(cin,s); stringstream ss(s); string word; vector<string> v; while(ss>>word) v.pb(word); reverse(v.begin(),v.end());
阅读全文
摘要:水题~。 string mp[]={"ling","yi","er","san","si", "wu","liu","qi","ba","jiu"}; int main() { string s; cin>>s; int sum=0; for(int i=0;i<s.size();i++) sum+
阅读全文
摘要:水题~。 int w[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; char mp[15]; int n; void init() { mp[0]='1'; mp[1]='0'; mp[2]='X'; for(int i=3;i<=10;i++) mp[i]=12
阅读全文
摘要:最多位,显然要用字符串存储辣。 map<char,int> mp; string s; int main() { cin>>s; for(int i=0;i<s.size();i++) mp[s[i]]++; for(auto t:mp) cout<<t.fi<<':'<<t.se<<e
阅读全文
摘要:水题~。 int n; int main() { cin>>n; string res; int t=n/100; for(int i=0;i<t;i++) res+='B'; t=n%100/10; for(int i=0;i<t;i++) res+='S'; t=n%100%10; for(in
阅读全文
摘要:不开long long见祖宗。 struct Node { LL galleon,sickle,knut; }a,b; int main() { scanf("%d.%d.%d",&a.galleon,&a.sickle,&a.knut); scanf("%d.%d.%d",&b.galleon,&
阅读全文
摘要:由于题目的数据范围为[0, 168],因此给定的整数x在十三进制下一定可以表示为(因为),于是只要想办法求出a跟b即可。 对上面的等式两边同时整除13,可以得到;对上面的等式两边同时对13取模,可以得到$
阅读全文
摘要:水题,跟求两个时间的差类似。 ··· struct Node { int galleon,sickle,knut; }a,b; int main() { scanf("%d.%d.%d",&a.galleon,&a.sickle,&a.knut); scanf("%d.%d.%d",&b.galle
阅读全文
摘要:额,反正是水题就对了。 先确定层数 分别输出上半部和下半部 计算剩下的数目,简单的等差数列运算。 int n; char c; int main() { cin>>n>>c; int s=(n+1)/2; int dep=0; for(int i=1;;i++) { s-=2*i-1; if(s <
阅读全文
摘要:哥德巴赫猜想,注意不要重复统计分解得到的素数对,即视为同一对。 const int N=35010; int primes[N],cnt; bool vis[N]; int n; void init(int n) { for(int i=2;i<=n;i++) if
阅读全文
摘要:考虑到不知道第个素数有多大,可以先用程序测试下第个素数是多少。 const int N=2e5+10; int primes[N],cnt; bool vis[N]; void init(int n) { for(int i=2;i<=n;i++) if(!vis[i]) { p
阅读全文
摘要:做了几个同类型题后,这种题基本是套路题了吧。 男生最低分数获得者的分数初始化为101、女生最高分数获得者的分数初始化为-1。 在读入学生信息时,根据其性别来判断: 如果是男生,且分数低于当前变量M所记录的分数,则用他的信息覆盖M。 如果是女生,且分数高于当前变量F所记录的分数,则用她的信息覆盖F。
阅读全文
摘要:在读入日期时判断该日期是否在合法日期的区间内,如果在,就使其更新最年长的人的出生日期和最年轻的人的出生日期。由于判断日期是否在合法日期区间 内、更新最年长和最年轻的信息都将涉及日期的比较操作,因此不妨写两个比较函数用来比较a与b的日期。 ps:有可能存在所有人的日期都不在合法区间内的情况,这时必须特
阅读全文
摘要:水题~。 值得一提的是没有显式给出的范围,所以要求空间复杂度咯。 struct Node { string name; string id; int grade; }cur,maxv,minv; int n; int main() { cin>>n; maxv.grade=-1,m
阅读全文
摘要:水题~。 const int N=1010; struct Node { string id; int try_id; int test_id; }a[N]; map<int,Node> mp; int n,m; int main() { cin>>n; for(int i=0;i<n;i++) {
阅读全文
摘要:求多个数的lcm,水题~ int n; int gcd(int a,int b) { return b?gcd(b,a%b):a; } int lcm(int a,int b) { return a/gcd(a,b)*b; } int main() { int T; cin>>T; while(T-
阅读全文
摘要:如果求导之后没有任何非零项,需要输出0 0。 int main() { string line; getline(cin,line); stringstream ss(line); int a,b; bool first=true; while(ss>>a>>b) { a*=b; b--; if(b
阅读全文
摘要:模拟题。 const int N=55; string mp[]={"S","H","C","D","J"}; string s[N]; string t[N]; int p[N]; int n; int cnt; void init() { for(int i=0;i<4;i++) for(int
阅读全文
摘要:直接输出移位后结果,注意行末空格的处理。 const int N=110; int a[N]; int n,m; int main() { cin>>n>>m; for(int i=0;i<n;i++) cin>>a[i]; m%=n; for(int i=n-m;i<n;i++) cout<<a[
阅读全文
摘要:水题~ int n; int main() { cin>>n; int cnta=0,cntb=0; for(int i=0;i<n;i++) { int a,suma,b,sumb; cin>>a>>suma>>b>>sumb; if(suma == a+b && sumb != a+b) cnt
阅读全文
摘要:水题~,就简单转换下时间。 int a,b; int main() { cin>>a>>b; int tim=round((b-a)/100.0); int hh=tim/3600,mm=tim%3600/60,ss=tim%3600%60; printf("%02d:%02d:%02d\n",hh
阅读全文
摘要:如果是奇数,则说明没有满足要求的答案,输出 。 如果是偶数且能被整除,则最少有只兔子,最多有只鸡。 如果是偶数且不能被整除,则最少有只兔子和只鸡,最多有只鸡。 int n; int main() {
阅读全文
摘要:注意不满位的话要补成位。 string s; set<int> S; int main() { cin>>s; while(s.size()<4) s='0'+s; while(true) { sort(s.begin(),s.end(),greater<char>()); string
阅读全文
摘要:对一个确定位置的A来说,以它形成的PAT的个数等于它左边P的个数乘以它右边T的个数。 例如对字符串APPAPT的中间那个A来说,它左边有两个P,右边有一个T,因此这个A能形成的PAT的个数就是2x1=2。 于是问题就转换为,对字符串中的每个A,计算它左边P的个数与它右边T的个数的乘积,然后把所有A的
阅读全文
摘要:sb读入!sb输出,不能输出空行! 找数组中的极值点。 const int N=210; int a[N]; int n; int main() { int T; while(cin>>T) { while(T--) { cin>>n; for(int i=0;i<n;i++) cin>>a[i];
阅读全文
摘要:高精度除二取余。 手算一个样例代码基本就能写了,比如985除2取余的计算过程。 string s; int main() { while(cin>>s) { vector<int> num; for(int i=0;i<s.size();i++) num.pb(s[i]-'0'); string r
阅读全文
摘要:贪心基础题。 每种药水的体积是相同的,那么影响浓度的只能是每种药水的浓度,属于集装箱问题。 将药水浓度从小到大排列,然后依次相加求平均值,直到平均值大于所给浓度限制。 const int N=110; int a[N]; int n,v,w; int main() { int T; cin>>T;
阅读全文
摘要:贪心水题 ~ 。 按性价比从大到小排序即可。 const int N=1010; PDD a[N]; int n,m; bool cmp(PDD &a, PDD &b) { return a.fi/a.se > b.fi/b.se; } int main() { while(cin>>m>>n) {
阅读全文
摘要:背包计数。 状态表示::从前个物品中选,体积不超过的方案数。 边界:,其余为。 const int N=25; int f[N][45]; int a[N]; int n; int main() { while(cin>>n)
阅读全文
摘要:首先解决“判断时忽略标点,输出进却要按原样”的问题? 可以用一个简单的方法:构造一个新字符串,不包含原来的标点符号,而且所有字符变成小写(顺便解决了大小写的问题)。 由于在求最大值时,不知道s[i]和s[j]在原串中的位置。因此,必须增加一个数组pos,用pos[i]保存s[i]在原串中的位置。 c
阅读全文
摘要:解法一:动态规划 回文串问题天生具有子问题性质: 一个回文串去掉两头以后,剩下依然是回文串。 对于一个子串而言,如果它是回文串,并且长度大于 ,那么将它首尾的两个字母去除之后,它仍然是个回文串。 根据这样的思路,我们就可以用动态规划的方法解决本题。我们用表示字符串 \(s\
阅读全文
摘要:状态表示:dp[i]是必须以A[i]结尾的连续序列。 那么只有两种情况: 这个最大和的连续序列只有一个元素,即以A[i]开始,以A[i]结尾。 这个最大和的连续序列有多个元素,即从前面某处A[p]开始(p<i),一直到A[i]结尾。 对第一种情况,最大和就是A[i]本身。 对第二种情况,最大和是dp
阅读全文
摘要:set和map的结合题吧,虽然不难,但还是值得记录一下。 多case,注意清空操作,因为这个了两发。 const int N=110; int a[N],b[N]; set<int> num,group; map<int,int> mp[N]; int n; int main() {
阅读全文
摘要:set裸题,话说题目一开始就点明并不是太简单,不要做的太快,交的时候还犹豫了一下。。。 交完:水题=_= 。 const int N=1e5+10; set<char> S; string s1,s2; int main() { getline(cin,s1); getline(cin,s2); f
阅读全文
摘要:map裸题吧,当然由于数字大小在 ,所以开数组记录也是可以的。 const int N=1e5+10; int a[N]; map<int,int> mp; int n; int main() { cin>>n; for(int i=0;i<n;i++) cin>>a[i]
阅读全文