【1】2018校招真题——舞会
https://www.nowcoder.com/practice/9efe02ab547d4a9995fc87a746d7eaec?tpId=90&tqId=30980&tPage=11&rp=11&ru=%2Fta%2F2018test&qru=%2Fta%2F2018test%2Fquestion-ranking
题目描述
今天,在冬木市举行了一场盛大的舞会。参加舞会的有n 位男士,从 1 到 n 编号;有 m 位女士,从 1 到 m 编号。对于每一位男士,他们心中都有各自心仪的一些女士,在这次舞会中,他们希望能与每一位自己心仪的女士跳一次舞。同样的,对于每一位女士,她们心中也有各自心仪的一些男士,她们也希望能与每一位自己心仪的男士跳一次舞。在舞会中,对于每一首舞曲,你可以选择一些男士和女士出来跳舞。但是显然的,一首舞曲中一位男士只能和一位女士跳舞,一位女士也只能和一位男士跳舞。由于舞会的时间有限,现在你想知道你最少需要准备多少首舞曲,才能使所有人的心愿都得到满足?
输入描述:
第一行包含两个整数n,m,表示男士和女士的人数。1≤n,m≤ 1000 接下来n行, 第i行表示编号为i的男士有ki个心仪的女生 然后包含ki个不同的整数分别表示他心仪的女士的编号。 接下来m行,以相同的格式描述每一位女士心仪的男士。
输出描述:
一个整数,表示最少需要准备的舞曲数目。
示例1
输入
复制
2 3 1 1 2 2 3 0 0 0
输出
复制
2
示例2
输入
复制
3 3 2 1 2 2 1 3 2 2 3 1 1 2 1 3 2 2 3
输出
复制
2
说明
对于样例2,我们只需要两首舞曲,第一首舞曲安排(1,1),(2,3),(3,2);第二首舞曲安排(1,2),(2,1),(3,3)。
解题思路:
这道题的输入略微复杂,最初我想的是,将男嘉宾心仪的女嘉宾以及女嘉宾心仪的男嘉宾合并为一个表,这个表记录男嘉宾一共需要和几个心仪的女嘉宾以及心仪自己的女嘉宾跳舞,这样有时候一支舞可以解决两个互相心仪的对象,最后记录哪位男嘉宾需要跳最多的舞,就知道一共有几首舞曲。但是这里存在一个问题,有时候多位男嘉宾都想和同一位女嘉宾跳舞,这时候男嘉宾可能要排队,需要的舞曲数量会增加,因此不合适。
这道题的解题要点有两个:
1、将男女嘉宾心仪对象合并为一个表时,可以删除重复元素(即男想和女跳,女也想和男跳),可以用set容器,保证不出现重复元素。
2、一个女生和多个男生跳舞时,跳舞的先后顺序不影响舞曲的数目。
因此当将男女嘉宾心仪对象合并为一个表后,采用遍历的方法,使用一个数组记录当前舞曲时女嘉宾是否正在跳舞,最后记录循环的次数,就可以解决。
代码如下:
//牛客网-舞会
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <set>
#include <vector>
#include <cstring>
#include <algorithm>using namespace std;int main(){//freopen("data.txt","r",stdin);int n, m;cin>>n>>m;int num, peo;set<int> s;set<int>::iterator it;vector<set<int> > fam;for (int i = 0; i < n; i++){cin>>num;while (num--){cin>>peo;s.insert(peo);}fam.push_back(s);s.clear();}for (int i = 0; i < m; i++){cin>>num;while (num--){cin>>peo;fam[peo - 1].insert(i + 1);}}int femal[1005];//记录当前舞曲女嘉宾是否被人约舞int break_point = 0;int ans = 0;while(1){memset (femal, 0, sizeof(femal));for (int i = 0; i < n; i++){if (fam[i].empty()) {break_point++; continue;}//表示这个男嘉宾已经不需要跳舞了for (it = fam[i].begin(); it != fam[i].end(); it++){if (femal[*it] == 0) {femal[*it]++; fam[i].erase(*it); break;}}}ans ++;if (break_point == n) {break;}//当所有男嘉宾都不需要跳舞,输出答案break_point = 0;}//cout << (*max_element(femal, femal + n)) << endl;cout<<ans-1<<endl;return 0;}
【1】2018校招真题——舞会相关推荐
- 牛客网 2018校招真题 美团点评 K的倍数
Description 牛客网 2018校招真题 K的倍数 Solving Ideas sum[i + 1]: 表示序列p[0]...p[i]的和 从长度最大的子串开始判断,当剩余需要判断子串长度不可 ...
- 牛客网 2018校招真题 摩拜 排序次数
Description 牛客网 2018校招真题 排序次数 Solving Ideas 将数组a的元素拷贝到数组b 对数组b进行排序 对比数组b,统计数组a中已排序的元素个数 如:a = [2, 11 ...
- 牛客网 2018校招真题 滴滴出行 寻找丑数
Description 牛客网 2018校招真题 寻找丑数 Solving Ideas 参考<剑指offer>丑数 Time complexity : O(n)O(n)O(n) Space ...
- 牛客网 2018校招真题 爱奇艺 最后一位
Description 牛客网 2018校招真题 最后一位 Solving Ideas 二分查找 Solution import java.io.BufferedReader; import java ...
- 牛客网 2018校招真题 京东 回文
Description 牛客网 2018校招真题 回文 Solving Ideas 计算以str[str.length() - 1]为结尾的最大的回文长度,从而判断最少需要追加多少个字母才能使整个串成 ...
- 牛客网 2018校招真题 美团点评 关灯游戏
Description 牛客网 2018校招真题 关灯游戏 Solving Ideas 只与最右边的数字有关,如果最右边的数字为1,则Alice赢,否则Bob赢 假设最右边的数字为1 因为Alice是 ...
- 牛客网 2018校招真题 网易 骰子游戏
Description 牛客网 2018校招真题 骰子游戏 Solving Ideas 参考<剑指offer>n个骰子的点数 考虑用两个数组来存储骰子点数的每一个总数出现的次数. 在一次循 ...
- 牛客网 2018校招真题 美团点评 重要节点
Description 牛客网 2018校招真题 重要节点 Solving Ideas BFS 创建一个标记数组arrive,arrive[i][j]为true表示从i可以到达j, false则不能 ...
- 牛客网 2018校招真题 招商银行信用卡 整数成绩最大化
Description 牛客网 2018校招真题 整数成绩最大化 Solving Ideas 当n>4时,最大受益为尽可能拆分出更多的数字3,最后一个不足3的,若其为1则分给其中一个3,得到4, ...
最新文章
- 皮一皮:这几天最容易搞错的事情...
- Rails Migration Data Model栏位修改及数据类型介绍
- 斐波那契数列的鬼畜的性质
- 深度概览卷积神经网络全景图,没有比这更全的了!
- 深入理解Android(三):Xposed详解
- gcn 图卷积神经网络_GCN图卷积网络入门详解
- WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[实现篇]
- 吴江智慧城市产业化“航母”起航
- 信号公式汇总之拉普拉斯变换
- java学习手册下载_java学习手册
- C语言期末考试知识点
- 序列号 java_JAVA序列号的serialVersionUID
- 湖南省中职计算机应用教资笔试+面试心得
- SIM800C通讯模块调试
- 关于使用媒体查询@meda失效原因的总结
- API理解清晰(转载)
- photoshop中调整橡皮擦的像素大小
- 它又来了!FastJson又被发现漏洞,autotype的安全控制开关限制可以被绕过...你方了没?...
- Gateway集成swagger3.0
- HTML5手机网站模板:wap故宫手机微信专题页面模板html源码( HTML+CSS+JavaScript)