Ⅰ.L2-1 分而治之---邻接表

  1. 分而治之,各个击破是兵家常用的策略之一。在战争中,我们希望首先攻下敌方的部分城市,使其剩余的城市变成孤立无援,然后再分头各个击破。为此参谋部提供了若干打击方案。本题就请你编写程序,判断每个方案的可行性。
  2. 输入格式:
  3. 输入在第一行给出两个正整数 N M(均不超过10 000),分别为敌方城市个数(于是默认城市从 1 N 编号)和连接两城市的通路条数。随后 M 行,每行给出一条通路所连接的两个城市的编号,其间以一个空格分隔。在城市信息之后给出参谋部的系列方案,即一个正整数 K (≤ 100)和随后的 K 行方案,每行按以下格式给出:
  4. Np v[1] v[2] ... v[Np]
  5. 其中 Np 是该方案中计划攻下的城市数量,后面的系列 v[i] 是计划攻下的城市编号。
  6. 输出格式:
  7. 对每一套方案,如果可行就输出YES,否则输出NO
  8. 输入样例:
  9. 10 11
  10. 8 7
  11. 6 8
  12. 4 5
  13. 8 4
  14. 8 1
  15. 1 2
  16. 1 4
  17. 9 8
  18. 9 1
  19. 1 10
  20. 2 4
  21. 5
  22. 4 10 3 8 4
  23. 6 6 1 7 5 4 9
  24. 3 1 8 4
  25. 2 2 8
  26. 7 9 8 7 6 5 4 2
  27. 输出样例:
  28. NO
  29. YES
  30. YES
  31. NO
  32. NO

思路:阅读理解,画画图还是能想到的,考的是邻接表。

城市被攻破孤立,意思就是结点没有邻接点了,它原来的邻接点都被攻打了,只需要用数组统计邻接边的数量,或者集合统计是否一条边的两个顶点都被攻打了

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. /*
  4. edge数组中存入边
  5. 对于每一个方案,将攻打的城市节点存入set集合中,查询m条边如果边对应的两个点都没被攻打 说明这条边完整-->两个城市节点是连通的(方案不可行
  6. */
  7. int edge[10010][2];
  8. set<int> se;
  9. int n,m,k;
  10. int main(){
  11. cin>>n>>m;
  12. for(int i=1;i<=m;i++){
  13. cin>>edge[i][0];
  14. cin>>edge[i][1];
  15. }
  16. cin>>k;
  17. for(int i=1;i<=k;i++){
  18. int np;
  19. cin>>np;
  20. for(int j=1;j<=np;j++){
  21. int city;
  22. cin>>city;
  23. se.insert(city);
  24. }
  25. bool flag = true;
  26. for(int j=1;j<=m;j++){
  27. if(se.find(edge[j][0]) == se.end() && se.find(edge[j][1]) == se.end()){
  28. flag = false;
  29. break;
  30. }
  31. }
  32. if(flag) cout<<"YES"<<endl;
  33. else cout<<"NO"<<endl;
  34. se.clear();
  35. }
  36. return 0;
  37. }

Ⅱ.L2-2 小字辈 ---树的深度

  1. 本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。
  2. 输入格式:
  3. 输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族成员从 1 N 编号。随后第二行给出 N 个编号,其中第 i 个编号对应第 i 位成员的父/母。家谱中辈分最高的老祖宗对应的父/母编号为 -1。一行中的数字间以空格分隔。
  4. 输出格式:
  5. 首先输出最小的辈分(老祖宗的辈分为 1,以下逐级递增)。然后在第二行按递增顺序输出辈分最小的成员的编号。编号间以一个空格分隔,行首尾不得有多余空格。
  6. 输入样例:
  7. 9
  8. 2 6 5 5 -1 5 6 4 7
  9. 输出样例:
  10. 4
  11. 1 9

思路:画出图,就是一颗树,

方法一:路径压缩;方法二:bfs从根出发层次遍历;方法三dfs从根深搜,统计等级(到根的距离)

bfs做法:从根出发层次遍历,统计等级

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 100010;
  4. int n;
  5. vector<int> g[maxn];
  6. vector<int> u[maxn];
  7. int vis[maxn];
  8. int maxrank = 1;
  9. struct node{
  10. int v;
  11. int rank;
  12. node(int xx,int rankk){
  13. v = xx;
  14. rank = rankk;
  15. }
  16. };
  17. void bfs(int s){
  18. queue<node> q;
  19. q.push(node(s,1));
  20. while(!q.empty()){
  21. int curv = q.front().v;
  22. int currank = q.front().rank;
  23. u[currank].push_back(curv);
  24. q.pop();
  25. if(currank > maxrank) maxrank = currank;
  26. vis[curv] = 1;
  27. for(int i=0;i<g[curv].size();i++){
  28. if(!vis[g[curv][i]]){
  29. q.push(node(g[curv][i],currank+1));
  30. }
  31. }
  32. }
  33. }
  34. int main(){
  35. cin>>n;
  36. int root = 1;
  37. int v;
  38. for(int i=1;i<=n;i++){
  39. cin>>v;
  40. g[v].push_back(i);
  41. if(v==-1){
  42. root = i;
  43. }
  44. }
  45. bfs(root);
  46. cout<<maxrank<<endl;
  47. int first = 1;
  48. for(int i=0;i<u[maxrank].size();i++){
  49. if(first){
  50. first = 0;
  51. cout<<u[maxrank][i];
  52. }else{
  53. cout<<" "<<u[maxrank][i];
  54. }
  55. }
  56. return 0;
  57. }

Ⅲ.L2-3 名人堂与代金券---sort排序重载

  1. 对于在中国大学MOOChttp://www.icourse163.org/ )学习“数据结构”课程的学生,想要获得一张合格证书,总评成绩必须达到 60 分及以上,并且有另加福利:总评分在 [G, 100] 区间内者,可以得到 50 元 PAT 代金券;在 [60, G) 区间内者,可以得到 20 元PAT代金券。全国考点通用,一年有效。同时任课老师还会把总评成绩前 K 名的学生列入课程“名人堂”。本题就请你编写程序,帮助老师列出名人堂的学生,并统计一共发出了面值多少元的 PAT 代金券。
  2. 输入格式:
  3. 输入在第一行给出 3 个整数,分别是 N(不超过 10 000 的正整数,为学生总数)、G(在 (60,100) 区间内的整数,为题面中描述的代金券等级分界线)、K(不超过 100 且不超过 N 的正整数,为进入名人堂的最低名次)。接下来 N 行,每行给出一位学生的账号(长度不超过15位、不带空格的字符串)和总评成绩(区间 [0, 100] 内的整数),其间以空格分隔。题目保证没有重复的账号。
  4. 输出格式:
  5. 首先在一行中输出发出的 PAT 代金券的总面值。然后按总评成绩非升序输出进入名人堂的学生的名次、账号和成绩,其间以 1 个空格分隔。需要注意的是:成绩相同的学生享有并列的排名,排名并列时,按账号的字母序升序输出。
  6. 输入样例:
  7. 10 80 5
  8. cy@zju.edu.cn 78
  9. cy@pat-edu.com 87
  10. 1001@qq.com 65
  11. uh-oh@163.com 96
  12. test@126.com 39
  13. anyone@qq.com 87
  14. zoe@mit.edu 80
  15. jack@ucla.edu 88
  16. bob@cmu.edu 80
  17. ken@163.com 70
  18. 输出样例:
  19. 360
  20. 1 uh-oh@163.com 96
  21. 2 jack@ucla.edu 88
  22. 3 anyone@qq.com 87
  23. 3 cy@pat-edu.com 87
  24. 5 bob@cmu.edu 80
  25. 5 zoe@mit.edu 80

思路:结构体每个人的账号和分数,重载sort排序,排出等级(并列)

其他参考代码:https://blog.csdn.net/caipengbenren/article/details/87791719

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. struct stu{
  4. string name;
  5. int score;
  6. };
  7. //排序 先按分数再按字典序
  8. bool cmp(stu a,stu b){
  9. if(a.score == b.score){
  10. return a.name < b.name;
  11. }
  12. return a.score > b.score;
  13. }
  14. stu s[10010];
  15. int n,g,k;
  16. int main(){
  17. cin>>n>>g>>k;
  18. for(int i=0;i<n;i++){
  19. cin>>s[i].name;
  20. cin>>s[i].score;
  21. }
  22. sort(s,s+n,cmp);
  23. int sum = 0;
  24. for(int i=0;i<n;i++){
  25. if(s[i].score >=g && s[i].score <=100){
  26. sum += 50;
  27. }else if(s[i].score >=60 && s[i].score <g){
  28. sum += 20;
  29. }
  30. }
  31. cout<<sum<<endl;
  32. int t = 0;
  33. for(int i=0;i<n;i++){
  34. if(t>=k)break;
  35. cout<<t+1<<" "<<s[i].name<<" "<<s[i].score<<endl;
  36. int d = t;
  37. for(int j=i+1;j<n;j++){
  38. if(s[i].score == s[j].score){
  39. cout<<t+1<<" "<<s[j].name<<" "<<s[j].score<<endl;
  40. d++;
  41. i++;
  42. }else{
  43. break;
  44. }
  45. }
  46. t = d;
  47. t++;
  48. }
  49. return 0;
  50. }

Ⅳ.L2-4 秀恩爱分得快---数据存放(STL)

  1. 古人云:秀恩爱,分得快。
  2. 互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度。如果一张照片上出现了 K 个人,这些人两两间的亲密度就被定义为 1/K。任意两个人如果同时出现在若干张照片里,他们之间的亲密度就是所有这些同框照片对应的亲密度之和。下面给定一批照片,请你分析一对给定的情侣,看看他们分别有没有亲密度更高的异性朋友?
  3. 输入格式:
  4. 输入在第一行给出 2 个正整数:N(不超过1000,为总人数——简单起见,我们把所有人从 0 N-1 编号。为了区分性别,我们用编号前的负号表示女性)和 M(不超过1000,为照片总数)。随后 M 行,每行给出一张照片的信息,格式如下:
  5. K P[1] ... P[K]
  6. 其中 K(≤ 500)是该照片中出现的人数,P[1] ~ P[K] 就是这些人的编号。最后一行给出一对异性情侣的编号 A B。同行数字以空格分隔。题目保证每个人只有一个性别,并且不会在同一张照片里出现多次。
  7. 输出格式:
  8. 首先输出 A PA,其中 PA 是与 A 最亲密的异性。如果 PA 不唯一,则按他们编号的绝对值递增输出;然后类似地输出 B PB。但如果 A B 正是彼此亲密度最高的一对,则只输出他们的编号,无论是否还有其他人并列。
  9. 输入样例 1
  10. 10 4
  11. 4 -1 2 -3 4
  12. 4 2 -3 -5 -6
  13. 3 2 4 -5
  14. 3 -6 0 2
  15. -3 2
  16. 输出样例 1
  17. -3 2
  18. 2 -5
  19. 2 -6
  20. 输入样例 2
  21. 4 4
  22. 4 -1 2 -3 0
  23. 2 0 -3
  24. 2 2 -3
  25. 2 -1 2
  26. -3 2
  27. 输出样例 2
  28. -3 2

思路:

  1. 我们只需要分别更新 给出的papb两人的亲密度(无需在输入时每个人都去更新一遍)
  2. vector<vector<int> > p:存照片上的数据(每张照片上有哪些人)
  3. vector<double> pa pb: 存放与a/b有关系的人的亲密度
  4. 遍历一遍所有照片 如果包含a/b就更新与a/b是异性关系的亲密度
  5. 判断ab是否分别为对方亲密度最高值 按题目要求输出结果

代码转载至:https://blog.csdn.net/wsxyh1071652438/article/details/82115346

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. bool gender[1000]={0}; //gender[person-id]=if-is-a-girl, 1 for girl, 0 for boy
  4. int read(){
  5. int input=0, flag=0;
  6. char a=getchar();
  7. while((a<'0' || a>'9') && a!='-')
  8. a=getchar();
  9. if(a=='-'){
  10. flag=1;
  11. a=getchar();
  12. }
  13. while(a>='0' && a<='9'){
  14. input=input*10+a-'0';
  15. a=getchar();
  16. }
  17. gender[input]=flag; //upgrade gender[] before exit
  18. return input;
  19. }
  20. int main(){
  21. int n, m, k, cnt, a, b;
  22. double pa_max=0.0, pb_max=0.0;
  23. scanf("%d%d",&n,&m);
  24. vector<vector<int> > p(n); //photos
  25. vector<double> pa(n,0.0), pb(n,0.0); //buckets, pa[person-id] = intimacy between a & person-id
  26. for(unsigned int i=0;i<m;++i){ //read photos
  27. scanf("%d",&cnt);
  28. p[i].resize((unsigned int)cnt);
  29. for(unsigned int j=0;j<cnt;++j)
  30. p[i][j]=read();
  31. }
  32. a=read(), b=read();
  33. for(unsigned int i=0;i<m;++i){
  34. bool founda=find(p[i].begin(),p[i].end(),a)!=p[i].end(); //if this photo has a
  35. bool foundb=find(p[i].begin(),p[i].end(),b)!=p[i].end(); //if this photo has b
  36. if(founda || foundb){
  37. for(unsigned int j=0;j<p[i].size();++j){
  38. if(founda && gender[a]!=gender[p[i][j]]){ //if found a && current assessing person-id (p[i][j]) has a different gender from a's
  39. pa[p[i][j]]+=(double)1/p[i].size();
  40. pa_max=max(pa_max,pa[p[i][j]]);
  41. }else if(foundb && gender[b]!=gender[p[i][j]]){ //else found b && current assessing person-id (p[i][j]) has a different gender from b's
  42. pb[p[i][j]]+=(double)1/p[i].size();
  43. pb_max=max(pb_max,pb[p[i][j]]);
  44. }
  45. }
  46. }
  47. }
  48. if(pa_max==pa[b] && pb_max==pb[a]) //if a & b are each other's most intimate person
  49. printf("%s%d %s%d\n",gender[a]?"-":"",a,gender[b]?"-":"",b);
  50. else{
  51. for(unsigned int i=0;i<n;++i){
  52. if(pa[i]==pa_max)
  53. printf("%s%d %s%d\n",gender[a]?"-":"",a,gender[i]?"-":"",i);
  54. }
  55. for(unsigned int i=0;i<n;++i){
  56. if(pb[i]==pb_max)
  57. printf("%s%d %s%d\n",gender[b]?"-":"",b,gender[i]?"-":"",i);
  58. }
  59. }
  60. return 0;
  61. }

Ⅴ:小结

2018年的LV2进阶题还是比较容易的。做题要细心,灵活,合理用STL大法。希望2019也是如此。。

基础数据结构(STL大法) + 一点点图论(邻接表、连通分量、dfs、bfs、并查集)

细心一点!

2018年天梯赛LV2题目汇总小结的更多相关文章

  1. 2017年天梯赛LV2题目汇总小结

    Ⅰ.L2-021 点赞狂魔---STL应用 微博上有个"点赞"功能,你可以为你喜欢的博文点个赞表示支持.每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性 ...

  2. PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……)

    PTA|团体程序设计天梯赛-练习题目题解锦集(持续更新中) 实现语言:C/C++:      欢迎各位看官交流讨论.指导题解错误:或者分享更快的方法!! 题目链接:https://pintia.cn/ ...

  3. 【GPLT】 2018年天梯赛全国总决赛 L2-2 小字辈(c++)

    题目: 这一题并不是很难,属于常规的图论遍历题,这里我是用的bfs(dfs应该也可以,但明显bfs简单一些). 本人写的时候写了很多没必要头文件,自己可以根据内容删去,必要的我会写上注释 如有错误,请 ...

  4. L1-049. 天梯赛座位分配

    天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位 ...

  5. 『ACM C++』 PTA 天梯赛练习集L1 | 052-053

    今日刷题,水题水题 ------------------------------------------------L1-052------------------------------------ ...

  6. 2018天梯赛第一次训练题解和ac代码

    随着评讲的进行代码和题解会逐步放上来 2018天梯赛第一次训练 1001 : 进制转换 Time Limit(Common/Java):1000MS/10000MS     Memory Limit: ...

  7. 2018天梯赛、蓝桥杯、(CCPC省赛、邀请赛、ICPC邀请赛)校内选拔赛反思总结!

    才四月份,上半年的比赛就告一段落了.. 天梯赛混子,三十个人分最低,把队友拖到了国三,蓝桥杯省二滚粗,止步京城,旅游选拔赛成功选为替补二队,啊! 不过既然已经过去,我们说些乐观的一面,积累了大赛经验是 ...

  8. 记第一届 CCCC-团体程序设计天梯赛决赛 参赛

    其他都没什么,上午报道,下午比赛两个半小时,最后139分 但四我超遗憾的是,最后在做L3-1二叉搜索树,因为看到有辣么多人做出来,可是我没做出来啊 比赛结束后看了看其他两道当场吐血,L3-3直捣黄龙不 ...

  9. 团体程序设计天梯赛(CCCC) L3019 代码排版 方法与编译原理密切相关,只有一个测试点段错误

    团体程序设计天梯赛代码.体现代码技巧,比赛技巧.  https://github.com/congmingyige/cccc_code

随机推荐

  1. 清理孤儿文件 clearing up outdated orphans

    pacman -Rns $(pacman -Qtdq) It lists all packages installed as dependencies but no longer required b ...

  2. oracle忘记密码用户名被锁定_解决方案

    本方案参考http://www.cnblogs.com/iosundersunshine/p/5313174.html 解决方案(window): 进入cmd命令 按照图上五步,即可 1,输入 ech ...

  3. GitLab上传项目到新的分支

    多人协同开发,GitLab上的group仓库里的master分支作为开发分支(最终从dev提交的代码),dev分支作为每个人的代码测试后合并的分支,每个人需要定期merge request自己的分支到 ...

  4. Nginx之编译安装的nginx加入systemctl

    编译安装的nginx需要添加rc.local 编译安装后设置 /usr/lib/systemd/system/nginx.service [Unit] Description=nginx After= ...

  5. 2016ACM/ICPC亚洲区沈阳站 - A/B/C/E/G/H/I - (Undone)

    链接:传送门 A - Thickest Burger - [签到水题] ACM ICPC is launching a thick burger. The thickness (or the heig ...

  6. python-----函数参数类型

    #函数参数类型:1 位置参数 2 默认参数 3 关键字参数 4可变参数 包裹位置参数*args 包裹关键字参数 **kargs#参数位置顺序:先位置参数,默认参数,包裹位置,包裹关键字(定义和调用都应 ...

  7. 深度学习基础(三)NIN_Network In Network

    该论文提出了一种新颖的深度网络结构,称为"Network In Network"(NIN),以增强模型对感受野内local patches的辨别能力.与传统的CNNs相比,NIN主 ...

  8. js--单选按钮赋值

    var sex='${userInfo.sex}'; if(sex=="女"){ $("input[name=sex][value='女']").attr(&q ...

  9. 洛谷P2949 工作调度Work Scheduling [USACO09OPEN] 贪心

    正解:贪心+并查集(umm不用并查集也成qwq 解题报告: 水题?主要感觉想到了俩方法然后还只实现了一个,怕忘了所以想着开个新坑记录下qwq 然后先放下传送门QAQ(哦这题和supermarket,双 ...

  10. Spring Boot 2.0 新特性和发展方向

    以Java 8 为基准 Spring Boot 2.0 要求Java 版本必须8以上, Java 6 和 7 不再支持. 内嵌容器包结构调整 为了支持reactive使用场景,内嵌的容器包结构被重构了 ...