set, map, string, find(), string name[100],等的混合
Unrequited Love
Time Limit: 16 Seconds Memory Limit: 131072 KB
There are n single boys and m single girls. Each of them may love none, one or several of other people unrequitedly and one-sidedly. For the comingq days, each night some of them will come together to hold a single party. In the party, if someone loves all the others, but is not loved by anyone, then he/she is called king/queen of unrequited love.
Input
There are multiple test cases. The first line of the input is an integer T ≈ 50 indicating the number of test cases.
Each test case starts with three positive integers no more than 30000
--nmq
. Then each of the nextn lines describes a boy, and each of the nextm lines describes a girl. Each line consists of the name, the number of unrequitedly loved people, and the list of these people's names. Each of the lastq lines describes a single party. It consists of the number of people who attend this party and their names. All people have different names whose lengths are no more than20
. But there are no restrictions that all of them are heterosexuals.
Output
For each query, print the number of kings/queens of unrequited love, followed by their names in lexicographical order, separated by a space. Print an empty line after each test case. See sample for more details.
Sample Input
2
2 1 4
BoyA 1 GirlC
BoyB 1 GirlC
GirlC 1 BoyA
2 BoyA BoyB
2 BoyA GirlC
2 BoyB GirlC
3 BoyA BoyB GirlC
2 2 2
H 2 O S
He 0
O 1 H
S 1 H
3 H O S
4 H He O S
Sample Output
0
0
1 BoyB
0 0
0
题目大意:给定一些关系,对于每个人(男孩或女孩),列出他所喜欢的人(允许同性恋),对于每次询问(聚会),求这样一种人:他喜欢所有人,但所有人都不喜欢他
分析:简单分析可知,这种人假如存在,最多只有一个。因为假设有2个这样的人,他们彼此就与题意矛盾。故可以枚举这个人,如何快速枚举?
对于一次聚会,先把第一个人假设为这种人,遍历其后的人,与当前这个人判断关系,若发现这个人不可能是这种人,则把当前遍历的更新为这种人。
扫一遍后,再判断这个人是否真的是,只要和他前面所有的人判断一下即可
#include<cstdio>
#include<string>
#include<set>
#include<map>
using namespace std;
const int N=;
map<string,int> M;
map<string,int>::iterator it;
set< pair<int,int> > S;
string name[N];
int tol,party[N];
char na[];
int hash(char *s){ //关键的一段函数,许多注意点
it=M.find(s);
if(it!=M.end())return it->second;
else {
name[++tol]=s;
return M[s]=tol;
}
}
void Cin(int x){
int i,k,u,v;
for(i=;i<x;i++){
scanf("%s%d",na,&k);
u=hash(na);
while(k--){
scanf("%s",na);
v=hash(na);
S.insert(make_pair(u,v));
}
}
}
int main(){
int T,n,m,q,i,k,ans;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&m,&q);
M.clear(),S.clear(),tol=;
Cin(n),Cin(m);
while(q--){
scanf("%d%s",&k,na);
ans=party[]=M[na];
int p=;
for(i=;i<k;i++){
scanf("%s",na),party[i]=M[na];
if(S.find(make_pair(ans,party[i]))==S.end()||S.find(make_pair(party[i],ans))!=S.end()){ //查找核心
ans=party[i],p=i;
}
}
for(i=;i<p;i++){
if(S.find(make_pair(ans,party[i]))==S.end()||S.find(make_pair(party[i],ans))!=S.end())break;
}
if(i!=p)puts("");
else printf("1 %s\n",name[ans].c_str()); //输出注意点
}
puts("");
}
return ;
}
name[]数组的输出:不能直接写成 printf("1 %s\n",name[ans]),会出错,需要在后面加上“.c_str()”;
map<string,int>类型的容器,前面的string下标也可以用char类型的字符数组表示;
find(map和set都是可以用的)找不到就是==*.end(),找到就是!=*.end();
make_pair的用法,以及 map<string,int>::iterator it; 中it->second的用法
map清空也用clear;
传入函数中的字符数组用了“*”,并且后面没有“[]”;
摘自:http://blog.csdn.net/libing923/article/details/8902193
#include <iostream>
#include<cstdio>
#include<set>
#include<map>
using namespace std;
map<string,int> mp;
set< pair<int,int> > s;
string name[];
int n,m,p,l;
int party[]; int num(char *ch)
{
map<string,int>::iterator it;
it=mp.find(ch);
if (it!=mp.end()) return mp[ch];
else
{
name[++l]=ch;
mp[ch]=l;
return l;
}
}
void read(int n)
{
char ch[],str[];
for(int i=;i<=n;i++)
{
int k;
scanf("%s%d",&ch,&k);
int u=num(ch);
for(;k>;k--)
{
scanf("%s",&str);
int v=num(str);
s.insert(make_pair(u,v));
}
}
return;
}
int main()
{
int t;
while(~scanf("%d",&t))
{
for(;t>;t--)
{
scanf("%d%d%d",&n,&m,&p);
l=; mp.clear(); s.clear();
read(n);
read(m);
for(int i=;i<=p;i++)
{
int k;
char ch[];
scanf("%d",&k);
for(int j=;j<=k;j++)
{
scanf("%s",&ch);
party[j]=mp[ch];
}
bool flag;
for(int j=;j<=k;j++)
{
flag=;
for(int z=;z<=k;z++)
{
if (j==z) continue;
if (s.find(make_pair(party[j],party[z]))==s.end()) {flag=;break;}
if (s.find(make_pair(party[z],party[j]))!=s.end()) {flag=;break;}
}
if (flag) {printf("1 %s\n",name[party[j]].c_str());break;}
}
if (!flag) printf("0\n");
}
printf("\n");
}
}
return ;
}
上面是自己写的,在上一个程序的借鉴上。
set, map, string, find(), string name[100],等的混合的更多相关文章
- No converter found capable of converting from type [java.lang.String] to type [java.util.Map<java.lang.String, org.springframework.boot.logging.LogLevel>]
java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.conte ...
- Failed to bind properties under 'logging.level' to java.util.Map<java.lang.String, java.lang.String>
org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'log ...
- No converter found capable of converting from type [java.lang.String] to type [java.util.Map<java.lang.String, java.lang.String>]
java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.conte ...
- JAVA中List转换String,String转换List,Map转换String,String转换Map之间的转换类
<pre name="code" class="java"></pre><pre name="code" cl ...
- Java基础知识强化之集合框架笔记54:Map集合之HashMap集合(HashMap<String,String>)的案例
1. HashMap集合 HashMap集合(HashMap<String,String>)的案例 2. 代码示例: package cn.itcast_02; import java.u ...
- sprinbcloud学习之-Failed to bind properties under 'logging.level' to java.util.Map<java.lang.String>
日志报错,提示Failed to bind properties under 'logging.level' to java.util.Map<java.lang.String>, 原因为 ...
- List<Map<String, String>>和Map<String, List<String>>遍历
public void TestM() { List<Map<String, String>> lm = new ArrayList<>(); Ma ...
- 原型模式 private static Map<String,Prototype> map = new HashMap<String,Prototype>();
public class PrototypeManager { /** * 用来记录原型的编号和原型实例的对应关系 */ private static Map<String,Prototype& ...
- Map 集合 和 String 字符串相互转换工具类
package com.skynet.rimp.common.utils.util; import java.util.Arrays; import java.util.HashMap; import ...
- mybatis用Map<Long,List<String>>作为参数
mapper.xml文件里的<insert id="insertByMap" parameterType="java.util.Map"> inse ...
随机推荐
- corethink功能模块探索开发(十六)后台搜索功能
效果图: 代码很简单,就是添加搜索框,搜索字段,在初始化页面查询的时候添加查询条件. 1.添加搜索框 添加到删除按钮后边. ->setSearch('请输入设备名称/MAC/宿舍号', U('i ...
- JavaScript历史和标准
不管新手老手, 学门语言如果不简单了解这门语言谁创立的, 什么时候, 现在由谁来维护, 规范在哪? 总感觉, 少了点什么, 我就是这样. 历史 1994年美国网景(Netscape)公司发布自己的浏览 ...
- beego——高级查询
ORM以QuerySeter来组织查询,每个返回QuerySeter的方法都会获得一个新的QuerySeter对象. 基本使用方法: o := orm.NewOrm() // 获取 QuerySete ...
- jupyter常用快捷键
Jupyter Notebook 有两种键盘输入模式.即命令模式和编辑模式,这与 vim有些类似. 在编辑模式下,可以往单元中键入代码或文本,此时单元格被绿色的框线包围,且命令模式下的快捷键不生效. ...
- Apache和Nigix
Apache , Nginx 是开源的HTTP服务器软件 HTTP服务器本质上也是一种应用程序--它通常运行在服务器之上,绑定服务器的IP地址并监听某一个tcp端口来接收并处理HTTP请 ...
- python selenium firefox使用
演示的版本信息如下: Python 3.6.0 Selenium 3.5.0 Firefox 55.0.3 geckodriver v1.0.18.0 win64 1.前提准备 1.1 安装pyth ...
- PAT 天梯赛 L1-008. 求整数段和 【水】
题目链接 https://www.patest.cn/contests/gplt/L1-008 AC代码 #include <iostream> #include <cstdio&g ...
- cdoj1337郭大侠与阴阳家
地址:http://acm.uestc.edu.cn/#/problem/show/1337 思路: 郭大侠与阴阳家 Time Limit: 3000/4000MS (Java/Others) ...
- Hbase1.2.4概述
安装Hbase的时候,需要注意版本与Hadoop的版本兼容,具体查看:https://hbase.apache.org/book.html#basic.prerequisites 如下图: 我的Had ...
- java调用ffmpeg命令行推流遇到的问题
1.Java调用命令行,如果没有额外环境变量,不指定工作路径,Runtime有两个方法 public Process exec(String command) public Process exec( ...