01 2021 档案
摘要:题意 令“单词”的定义为大小写字母、数字的组合。给出一个字符串,问出现次数最多的单词及其出现次数(一切除了大小写字母、数字之外的字符都作为单词的分隔符)。其中字母不区分大小写,且最后按小写字母输出。 思路 算法主要分为两个步骤:从给定字符串中分割出“单词”、计数出现次数最多的单词。 由题意可知,单词
阅读全文
摘要:题意 给出N个结点的地址address、数据域data以及指针域next,然后给出链表的首地址,要求把在这个链表.上的结点按data值从小到大输出。 样例解释 按照输入,这条链表是这样的(结点格式为[address, data,next]): [00001, 0, 22222]→[22222, 10
阅读全文
摘要:题意 给出两条链表的首地址以及若干结点的地址、数据、下一个结点的地址,求两条链表的首个共用结点的地址。如果两条链表没有共用结点,则输出-1。 思路 由于地址的范围很小,因此可以直接用静态链表,但是依照题目的要求,在结点的结构体中再定义一个bool型变量visited,表示结点是否在第一条链表中出现,
阅读全文
摘要:这题给出了的排名规则 在结构体类型中存放题目要求的信息(准考证号、分数、考场号以及考场内排名)。 根据题目要求,需要写一个排序函数cmp,规则如下: 当分数不同时,按分数从大到小排序。 否则,按准考证号从小到大排序。 而算法本体则分为下面三个部分: 按考场读入各考生的信息,并对当前读入考场
阅读全文
摘要:注意进制转换时对0的特殊处理。 int a,b; string s; char tran(int x) { if(x >= 0 && x <= 9) return x+'0'; else return 'A'+x-10; } int get(char c) { if(isdigit(c)) retu
阅读全文
摘要:注意对相加为的特殊处理,结果一定为。 如果进制转换时使用的是while语句而不是do...while语句,那么要注意当A+B为0时需要特判输出0。 int a,b,d; int main() { cin>>a>>b>>d; int sum=a+b; vector<int> res; if
阅读全文
摘要:特定字符有可能是空格符,那么就不能用cin读入字符了。 第一个getchar()读取字符,第二个getchar()读取回车防止影响之后getline的读入。 int main() { string s; char c; while(getline(cin,s)) { c=getchar(); get
阅读全文
摘要:虽然是道水题,但还是有点东西可写的,顺道学习了一下string中find()的用法。 最暴力的思路就是找一个删一个,但删除的话必然涉及到大量元素的移动。 int main() { string s; cin>>s; getchar(); for(int i=0;i<s.size();i++) s[i
阅读全文
摘要:注意观察每一行的空格和行数的关系,以及星号和行数的关系。 int n; int main() { while(cin>>n) { for(int i=0;i<n;i++) { for(int j=0;j<n*2-(i+1)*2;j++) cout<<' '; for(int j=0;j<n+i*2;
阅读全文
摘要:虽然简单,但还是有一定代表性的,考察用映射查找学生信息。 const int N=1010; struct Stu { string name; string sex; int age; }; map<string,Stu> mp; int n,m; int main() { while(cin>>
阅读全文
摘要:模拟题,注意答案要求字典序最小。 甲赢的时候同时要记乙负,乙赢的时候同时要记甲负,这是成对出现的。 map<char,int> mpa,mpb; int res[2][3]; int n; int main() { cin>>n; for(int i=0;i<n;i++) { char a,b; c
阅读全文
摘要:贪心策略是:先从1 ~ 9中选择个数不为0的最小的数输出,然后从0~9输出数字,每个数字输出次数为其剩余个数。 策略正确性的证明:首先,由于所有数字都必须参与组合,因此最后结果的位数是确定的。然后,由于最高位不能为0,因此需要从[1, 9]中选择最小的数输出( 如果存在两个长度相同的数的最高位不同,
阅读全文
摘要:这里采用“总是选择单价最高的月饼出售,可以获得最大的利润”的策略。因此,对每种月饼,都根据其库存量和总售价来计算出该种月饼的单价。之后,将所有月饼按单价从高到低排序。 从单价高的月饼开始枚举。 如果该种月饼的库存量不足以填补所有需求量,则将该种月饼全部卖出,此时需求量减少该种月饼的库存量大小,收益值
阅读全文
摘要:整数除以2进行四舍五入的操作可以通过判断它是否是奇数来解决,以避免浮点数的介入。 int n; int main() { char c; cin>>n>>c; int m; if(n & 1) m=n/2+1; else m=n/2; for(int i=0;i<m;i++) { if(!i ||
阅读全文
摘要:用vis数组判断没有对应类型的数字,不能用a[i]的值为0判断,因为0的值模5也为0. int a[10]; bool vis[10]; int cnt; int n; int main() { while(cin>>n) { memset(a,0,sizeof a); memset(vis,0,s
阅读全文
摘要:环形前缀和。 dist[i]存储第i个结点到第i+1个结点的距离,sum[i]为前缀和数组,每次取两种走法(顺时针、 逆时针)当中距离的较小值即可。 const int N=1e5+10; int dist[N]; int sum[N]; int n,m; int main() { cin>>n;
阅读全文
摘要:手动实现stoi()方法。 int toInt(string s) { int res=0; for(int i=0;i<s.size();i++) if(isdigit(s[i])) res=res*10+(s[i]-'0'); if(s[0] == '-') res=-res; return r
阅读全文
摘要:用数组sum保存每个学校的编号对应的总分,在输入时将每一个分数score累加到学校编号id对应的sum[id]中,然后遍历整个数组找将总分最高的学校编号。 const int N=1e5+10; int sum[N]; int n; int main() { cin>>n; for(int i=0;
阅读全文
摘要:const int N=15; int a[N]; int n; int main() { n=10; for(int i=0;i<n;i++) cin>>a[i]; for(int i=0;i<n-1;i++) for(int j=0;j<n-1-i;j++) if(a[j] > a[j+1])
阅读全文
摘要:两个数的排序,只需要比较一下,如果第一个比第二个大,交换一下,否则什么都不用做。 三个数的排序 ,可以先将前两个排序,保证第一个比第二个小。 然后将第二个和第三个数排序,保证第二个比第三个小。 经过上面两次排序,保证了第三个是最大的,但不能保证第二个还比第一个大,因为第二次排序的时候可能改变了第二个
阅读全文
摘要:参考柳神代码,柳神的代码写的也太秒了Orz。啊这明明是个分的题,我为什么还要参考,菜的安详+_+ 。 题意 要求原数字乘后的结果是原数字的一个重新排列,用数组记录原数和新数的各位数字情况,最后只有全为0才代表新产生的数是原数的一个排列。 思路 首
阅读全文
摘要:一眼树的直径。 题意 给出N个结点与N-1条边,问:它们能否形成一棵N个结点的树?如果能,则从中选出结点作为树根,使得整棵树的高度最大。输出所有满足要求的可以作为树根的结点。 思路 当图连通时,由于题目保证只有N-1条边,因此一定能确定是一棵树,下面的任务就是选择合适的根结点,使得树的高度最大。具体
阅读全文
摘要:树的直径的模板题。 从任意一个节点出发(以号点为例),找出距离号点最远的点,为直径的一个端点 将清,找出距离最远的点, 即为直径的两个端点,即为树的直径长度 const int N=10010; vector<in
阅读全文
摘要:鬼畜读入。。。 stringstream的使用 如果多条路径和相同的话,输出叶子结点上值较小的一个。 const int N=10010; string inorder,postorder; int in[N],post[N]; int pos[N]; int n; int minsum; int
阅读全文
摘要:给定后序中序求先序,树中每个结点的值各不相同。 unordered_map<char,int> pos; string in,post; int n; void build(int inl,int postl,int n) { if(!n) return; char root=post[postl+
阅读全文
摘要:根据先序和中序确定后序。树中每个结点的值都是不同的,不需要特判了。 递归构造完左右子树后输出根即为后序。 string pre,in; unordered_map<char,PII> tree; unordered_map<char,int> pos; int build(int prel,int
阅读全文
摘要:树的前序遍历,水题~ unordered_map<char,char> l,r,fa; set<char> node; int n; void preorder(char root) { if(root == '*') return; cout<<root; preorder(l[root]); p
阅读全文
摘要:数据结构里的经典题了,不过这次是借助而不是花哨的指针 ^_^ 用一个数组来存树,结点上存的是下标,最后输出结果时要将下标对应成值,恰好我们存了中序遍历的下标和值的对应关系,于是最后输出层序遍历结果时将下标转成对应中序序列中的值就好了。 ps:树中每个结点的值都是不同的。 con
阅读全文
摘要:水题,水题,又读了假题@_@ 判断系数是否构成回文,数组大小开到就够了,最大为,而基数最小为,,即最多有位。 相同数码,基数越大,按权展开值越大,即为的单调性。 反之,相同数值,基数越小,位数越多。 ps: 加
阅读全文
摘要:状态数为,显然不能用二进制枚举了。 观察到下列性质: 交换区间反转的顺序对最终结果是没有影响的 对同一个区间进行两次以上的反转是多余的 由此,问题就转化成立求需要被反转的区间的集合。 我们先考虑一下最左端的硬币,包含该硬币的区间只有一个,因此如果该硬币和目标状态一致,我们就不需
阅读全文
摘要:本以为是个打表题,没想到竟是个规律题orz 打表 const int N=110; int a[N][N]; int n; void init() { for(int i=0;i<100;i++) { a[i][i]=1; for(int j=i+1;j<100;j++) a[i][j]=a[i][
阅读全文
摘要:又是熟悉的毒瘤进制转换题(雾) 注意点: 结果均在进制下表示 十六进制注意用表示嗷 int b; char get(int x) { if(x>=0 && x<=9) return '0'+x; return 'A'+x-10; } string b
阅读全文
摘要:比较好想的浮点数二分吧,虽然提前知道标签是二分>_< const int N=1e5+10; double a[N]; int n,m; bool check(double mid) { int cnt=0; for(int i=0;i<n;i++) cnt+=int(a[i]/mid); retu
阅读全文
摘要:挺好想的二分题吧。 const int N=1e5+10; PII a[N]; int n,k; bool check(int mid) { int res=0; for(int i=0;i<n;i++) res+=(a[i].fi/mid)*(a[i].se/mid); return res>=k
阅读全文
摘要:规定一个方向,满足条件就一直向一个方向搜,不满足则换方向。 偏移数组默认方向优先级为: 右 下 左 上 const int N=110; int dx[]={0,1,0,-1},dy[]={1,0,-1,0}; int a[N][N]; bool vis[N][N]; int n,m; i
阅读全文
摘要:简单模拟 const int N=310; struct Stu { int id; int c,m,e; int sum; bool operator<(const Stu &W) const { if(sum == W.sum) { if(c == W.c) { return id<W.id;
阅读全文
摘要:区间合并裸题 const int N=110; PII a[N]; int n,m; int main() { cin>>n>>m; for(int i=0;i<m;i++) cin>>a[i].fi>>a[i].se; sort(a,a+m); int l=a[0].fi,r=a[0].se; i
阅读全文
摘要:注意是求平均等待时间,而不是周转时间(受本学期os影响+_+) 这题大有文章(其实是寒假在家做题效率太低QAQ) 对个窗口分别维护对应的最早空闲时间,只要窗口一空闲即可安排顾客。 可以采用小根堆来维护,保证小根堆里的元素始终只有个,每次出队的窗口即为当前窗口的最早空闲时间。 对每个顾客:
阅读全文
摘要:题意 现已知n个考生的3门课分数C、M、E,而平均分数A可以由这3个分数得到。现在分别按这4个分数对n个考生从高到低排序,这样对每个考生来说,就会有4个排名且每个分数都会有一个排名。接下来会有m个查询,每个查询输入一个考生的ID,输出该考生4个排名中最高的那个排名及对应是A、C、M、E中的哪一个。如
阅读全文
摘要:我丢,又读假题了。。。理解成十进制系统下的质数判断了 看到系统,不免想起被离散支配的恐惧+_+ 题意 给定两个整数 和 ,如果 是一个质数,并且将 转化为 进制表示后,再进行反转,得到的新数字转化为十进制表示后如果也是一个质数,则称 \(N\
阅读全文
摘要:题意 给定一个无向图并规定,当删除图中的某个顶点时,将会同时把与之连接的边一起删除。接下来给出k个查询,每个查询给出一个欲删除的顶点编号,求删除该顶点(和与其连接的边)后需要增加多少条边,才能使图变为连通(注: k次查询均在原图上进行)。 思路 注意是无向图 上来直接写了个暴力的代码,改了无向图的b
阅读全文
摘要:虽然没读懂题意,按照样例模拟交了一发直接过了。。。 double a[3][3]; int main() { for(int i=0;i<3;i++) for(int j=0;j<3;j++) cin>>a[i][j]; double res=1; for(int i=0;i<3;i++) { in
阅读全文
摘要:统计叶子结点数目 const int N=110; vector<int> g[N]; int dep[N]; int cnt[N]; int maxh; int n,m; void bfs(int u) { queue<int> q; q.push(u); dep[u]=1; wh
阅读全文
摘要:水题了,注意删除相乘后系数为0的项 const int N=1010; int p[2][N]; double a[2][N]; map<int,double,greater<int> > mp; int n,m; int main() { cin>>n; for(int i=0;i<n;i++)
阅读全文
摘要:水~ int n; int main() { cin>>n; int sum=0; int now=0; for(int i=0;i<n;i++) { int x; cin>>x; if(x > now) sum+=6*(x-now); else sum+=4*(now-x); sum+=5; no
阅读全文
摘要:最大子段和 如果答案不唯一,输出索引较小的解。 如果所有数都为负数,输出0 解法一:贪心 若当前指针所指元素之前的和小于,则丢弃当前元素之前的数列。 const int N=10010; int a[N]; int n; int main() { cin>>n; for(int i=0;i<n
阅读全文
摘要:解法一:排序 struct Stu { string id; string start_time; string end_time; }; vector<Stu> v; int n; bool cmp1(Stu &a,Stu &b) { return a.start_time<b.start_tim
阅读全文
摘要:注意系数为的多项式要消去哦 map<int,double,greater<int>> mp; int n; int main() { for(int i=0;i<2;i++) { cin>>n; for(int j=0;j<n;j++) { int p; double a; scanf("%d
阅读全文
摘要:解法一:map map<char,string> mp; void init() { mp['1']="one"; mp['2']="two"; mp['3']="three"; mp['4']="four"; mp['5']="five"; mp['6']="six"; mp['7']="seve
阅读全文
摘要:同L2-001 紧急救援 (25分) 题意 给出N个城市,M条无向边。每个城市中都有一定数目的救援小组,所有边的边权已知。现在给出起点和终点,求从起点到终点的最短路径条数及最短路径上的救授小组数目之和。如果有多条最短路径,则输出数目之和最大的。 const int N=510; vector<PII
阅读全文
摘要:题意 计算 a+b 并以标准格式输出总和——也就是说,从最低位开始每隔三位数加进一个逗号(千位分隔符),如果结果少于四位则不需添加。 const int N=1010; int a,b; int main() { cin>>a>>b; int sum=a+b; string s=to_string(
阅读全文