并查集的使用时注意:

1. 合并两个结点是 F[sa] = sb 而不是 sb = F[sa],想一下含义。

2. 给每个结点赋予其自身为父节点时,要先判断它的父节点是不是0,也许已经有了。

我把照片里其他同学的成绩赋值为0,但是应该考虑到这张照片的配角也许是另外一张照片的主角,也就是该同学其实有成绩,所以只有在他的已有成绩不存在的情况下才能赋值为0。

AC代码

#include<cstdio>
#include<vector>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>using namespace std;const int maxn = 10010;int F[maxn] = {0};int findS(int x){int a = x;while(x!=F[x]){x = F[x];}while(a!=F[a]){int z = a;F[z] = x;a = F[a];}return x;
}void unite(int a,int b){int sa = findS(a);int sb = findS(b);if(sa!=sb)F[sa] = sb;//注意点1 return;
}map<int,int> idToG;struct univ{priority_queue<int,vector<int>,greater<int> > Q;int sum = 0;
};map<int,univ> idToU;vector<univ> vi;bool cmp(univ a,univ b){if(a.sum!=b.sum)return a.sum>b.sum;else if(a.Q.size()!=b.Q.size())return a.Q.size()<b.Q.size();else return a.Q.top()<b.Q.top();
}int main(){ int pN;//photo numbercin>>pN;while(pN--){int id,num,id2,grade;cin>>id>>num;if(F[id] == 0)F[id] = id;//注意点2 while(num--){cin>>id2;if(F[id2] == 0)F[id2] = id2;if(!idToG[id2])idToG[id2] = 0;//注意点3 unite(id,id2);}cin>>grade;idToG[id] = grade;}for(map<int,int>::iterator it = idToG.begin();it!=idToG.end();it++){int id = it->first;int grade = it->second;int root = findS(id);idToU[root].Q.push(id);idToU[root].sum += grade;}for(map<int,univ>::iterator it = idToU.begin();it!=idToU.end();it++){vi.push_back(it->second);}sort(vi.begin(),vi.end(),cmp);printf("%d\n",vi.size());for(int i=0;i<vi.size();i++){printf("%04d %d %d\n",vi[i].Q.top(),vi[i].Q.size(),vi[i].sum);}return 0;
}

浙江大学软件学院2020年保研上机模拟练习 7-3 Partial School Ranking相关推荐

  1. 浙江大学软件学院2020年保研上机模拟练习 7-4 Shopping With Coupons

    目录 解题思路演进过程 第一次程序 第二次程序 第三次程序 解题思路演进过程 首先是题目的理解上:有n个商品,n张优惠券,实际上能买的商品个数最多就是n*n,为啥呢,这题默认是买一个商品必须用一张券, ...

  2. 浙江大学软件学院2020年保研上机模拟练习

    浙江大学软件学院2020年保研上机模拟练习 7-1.Standard Form of Polynomial (20分) 7-2.Distance of Triples (25分) 7-3. Parti ...

  3. 浙江大学软件学院2020年保研上机模拟练习 7-2 Distance of Triples

    思路一: 3个数组都按照小到大排序,设置3个指针,起始都在数组的末尾,如果1个指针向前移动1位可以让对应元素和另两个数组元素的距离之和减小,则移动它.如果某一回合三个指针都没动,就跳出循环. 非满分: ...

  4. 浙江大学软件学院2020年保研上机真题练习

    用浏览器打开html文件即可,需要源文件私聊

  5. 浙江大学计算机与软件学院2019年保研上机模拟练习 --- 凌宸1642

    浙江大学计算机与软件学院2019年保研上机模拟练习 - 凌宸1642 7-1 Happy Numbers (20 分) - 简单数学 A happy number is defined by the ...

  6. 浙江大学软件学院2020年保研真题Distance of Triples (25 分)

    时间限制:300 ms 内存限制:64 MB The distance of triples (三元组) (a,b,c) is defined as D(a,b,c)=∣a−b∣+∣b−c∣+∣c−a ...

  7. 浙江大学计算机学院保研率,浙江大学2020届保研率25.9%,主要保研本校、复旦、交大、北大...

    原标题:浙江大学2020届保研率25.9%,主要保研本校.复旦.交大.北大 推免大户是医学院.计算机.电工.信息学院等. 1.推免比例 根据浙江大学本科生院<浙江大学推荐2020年免试研究生公示 ...

  8. 2020计算机保研经历

    本文章未经本人允许,不得私自转载! 打个小广告: 我的 Github :https://github.com/WilliamWuLH 不定期更新 LeetCode 刷题 和 各种学习笔记.欢迎 ⭐St ...

  9. 东北大学计算机保研每年多少清华,东北大学2020届保研率13%,主要保研本校、天大、国科大、华东、东南大学...

    根据<东北大学关于做好2020年推荐优秀应届本科毕业生免试攻读研究生工作的通知><2020年推免生名单公示>: 2020年东北大学推免生共计963人. 其中普通名额926人,辅 ...

最新文章

  1. Ubuntu实时监测系统性能工具
  2. linux中ctrl+z和ctrl+c的区别
  3. Android 自定义环形圆形显示统计数据z
  4. 第七章 比高斯更快的计算
  5. 【codevs2039】骑马修栅栏,欧拉回路
  6. 【LeetCode】剑指 Offer 19. 正则表达式匹配
  7. Linux timeout命令的使用:timeout - run a command with a time limit
  8. Linux系统安全之pam后门安装使用详解
  9. Cadence OrCAD Capture 设计准备图文教程
  10. 网络安全实验4 SQL注入攻击
  11. Ubuntu安装vmPlayer
  12. 给定经纬度计算距离_根据两点经纬度计算距离
  13. 自然语言在公路交通各建设阶段运用
  14. LeetCode 刷题: Fizz Buzz
  15. Metro 风格页面设计
  16. Shell 千分 逗号隔开
  17. 苹果手机相册怎么分类_电子相册怎么做?用手机app可以剪辑电子相册视频吗?...
  18. 《Python神经网络编程(Make Your Own Neural Network)》读书笔记
  19. 简单地获得UTM坐标系
  20. xmodem,ymodem,zmodem,kermit的主要区别

热门文章

  1. iOS 改变字符串中数字的颜色
  2. iOS 跑马灯之 TXScrollLabelView
  3. ScratchCardView:刮刮卡视图组件
  4. 开源大数据周刊-第11期
  5. cmd命令 安装本地服务器
  6. qt 拖拽 修改大小(二)
  7. Debugging Tools for Windows__from WDK7
  8. Linux: CentOS 7下搭建高可用集群
  9. closurescallbacks
  10. 贾扬清:我对人工智能方向的一点浅见