CodeForces 993B Open Communication(STL 模拟)
https://codeforces.com/problemset/problem/993/b


这题不难,暴力就能过,主要是题意太难懂了
题意:
现在有两个人,每个人手中有一对数,第一个人手中的数是n组数中的一对,第二个人手中的数是m组数中的一对
如果这两组数中只有一个数字相等,这该数为共享数字,怎样输出看思路吧
思路:
其实就是n对和m对数中,找共享数字,直接看样例吧:
在第一示例中,第一参与者通信对(1,2)和(3,4),第二参与者通信对(1,5),(3,4)。因为我们知道,他们收到的实际对共享一个数字,这不可能是他们都有(3,4)。因此,第一个参与者有(1,2),第二个参与者有(1,5),此时您已经知道共享号码是1。
在第二个例子中,第一个参与者有(1,2),第二个有(1,5),或者第一个有(3,4),第二个有(6,4)。在第一种情况下,他们都知道共享号码是1,在第二种情况下,他们都知道共享号码是4。你没有足够的信息来区分1和4。
在第三种情况下,如果第一个参与者被给予(1,2),他们不知道共享号码是什么,因为从他们的角度来看,第二个参与者可能被给予(1,3),在这种情况下共享号码是1,或者(2,3),在这种情况下共享号码是2。虽然第二个参与者确实知道数字,但您和第一个参与者都不知道,因此输出为-1。
比如 第一个人有一对数(a,b),第二个人有一对数(c,d)假设没对数第一个数均小于第二个数,题目保证a!=b&&c!=d;
如果出现a==c&&b==d,则直接跳过这组去判断下一组;
如果a==c&&b!=d || a==d&&b!=c ,则a为一个共享数字
同理b==d&&a!=c || b==d&&a!=d ,b为一个共享数字
如果在比较时,一组数(x,y)中x和y均为共享数字,则输出-1;
否则看共享数字的个数,如果只有一个共享数字,则输出这个共享数字,否则输出0;
注意:两个人都要遍历对方一遍
代码如下:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
const int INF=0x3f3f3f3f;
typedef long long LL;
const int mod=1e9+;
//const double PI=acos(-1);
#define Bug cout<<"---------------------"<<endl
const int maxn=1e5+;
using namespace std; vector<pair<int,int> > vt1;//第一个人的数
vector<pair<int,int> > vt2;//第二个人的数 int main()
{
int n,m;
scanf("%d %d",&n,&m);
//输入
for(int i=;i<=n;i++)
{
int x,y;
scanf("%d %d",&x,&y);
vt1.push_back(make_pair(min(x,y),max(x,y)));//pair的first中为小的数
}
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d %d",&x,&y);
vt2.push_back(make_pair(min(x,y),max(x,y)));
}
int f1[]={};
int tag=;//判断一组中两个数是否均为共享数字
for(vector<pair<int,int> >::iterator it1=vt1.begin();it1!=vt1.end();it1++)//遍历第一个人
{
int a=it1->first;//第一个人这对数中的较小值
int b=it1->second;//第一个人这对数中的较大值
int f[]={};//看该组两个数字是否均为共享数字
for(vector<pair<int,int> >::iterator it2=vt2.begin();it2!=vt2.end();it2++)
{
int c=it2->first;//第二个人这对数中的较小值
int d=it2->second;//第二个人这对数中的较大值
if(a==c&&b==d)
continue;
if(a==c&&b!=d)
{
f1[a]++;//共享数字a出现次数增加
f[]=;//第一个数为共享数字
}
else if(b==c)
{
f1[b]++;//共享数字b出现次数增加
f[]=;//第二个数为共享数字
}
else if(a==d)
{
f1[a]++;//共享数字a出现次数增加
f[]=;//第一个数为共享数字
}
else if(b==d)
{
f1[b]++;//共享数字b出现次数增加
f[]=;//第二个数为共享数字
}
}
if(f[]&&f[])//如果第一个人该组数字两个数均为共享数字,结果为-1
tag=;
}
int f2[]={};//其实没用
for(vector<pair<int,int> >::iterator it1=vt2.begin();it1!=vt2.end();it1++)//再从第二个人跑一遍
{
int a=it1->first;
int b=it1->second;
int f[]={};
for(vector<pair<int,int> >::iterator it2=vt1.begin();it2!=vt1.end();it2++)
{
int c=it2->first;
int d=it2->second;
if(a==c&&b==d)
continue;
if(a==c&&b!=d)
{
f2[a]++;
f[]=;
}
else if(b==c)
{
f2[b]++;
f[]=;
}
else if(a==d)
{
f2[a]++;
f[]=;
}
else if(b==d)
{
f2[b]++;
f[]=;
}
}
if(f[]&&f[])
tag=;
}
int num=;//共享数字的个数
int ans=;//如果共享数字只有一个,ans则为该共享数字
for(int i=;i<=;i++)
{
if(f1[i])
{
num++;
ans=i;
}
}
if(tag)
printf("-1\n");
else
{
if(num==)//共享数字有且只有一个
printf("%d\n",ans);
else//共享数字有多个
printf("0\n");
}
return ;
}
CodeForces 993B Open Communication(STL 模拟)的更多相关文章
- Codeforces 528A Glass Carving STL模拟
题目链接:点击打开链接 题意: 给定n*m的矩阵.k个操作 2种操作: 1.H x 横向在x位置切一刀 2.V y 竖直在y位置切一刀 每次操作后输出最大的矩阵面积 思路: 由于行列是不相干的,所以仅 ...
- stl+模拟 CCF2016 4 路径解析
// stl+模拟 CCF2016 4 路径解析 // 一开始题意理解错了.... #include <iostream> #include <string> #include ...
- CodeForces.158A Next Round (水模拟)
CodeForces.158A Next Round (水模拟) 题意分析 校赛水题的英文版,坑点就是要求为正数. 代码总览 #include <iostream> #include &l ...
- [Codeforces 1246B] Power Products (STL+分解质因数)
[Codeforces 1246B] Power Products (STL+分解质因数) 题面 给出一个长度为\(n\)的序列\(a_i\)和常数k,求有多少个数对\((i,j)\)满足\(a_i ...
- Educational Codeforces Round 24 A 水 B stl C 暴力 D stl模拟 E 二分
A. Diplomas and Certificates time limit per test 1 second memory limit per test 256 megabytes input ...
- CF--思维练习--CodeForces - 220C Little Elephant and Shifts (STL模拟)
ACM思维题训练集合 The Little Elephant has two permutations a and b of length n, consisting of numbers from ...
- Codeforces 799B - T-shirt buying(STL)
题目链接:http://codeforces.com/problemset/problem/799/B 题目大意:有n件T恤,每件T体恤都分别有价格(每件衣服的价格不重复).前面的颜色.背部的颜色三种 ...
- Codeforces 747C:Servers(模拟)
http://codeforces.com/problemset/problem/747/C 题意:有n台机器,q个操作.每次操作从ti时间开始,需要ki台机器,花费di的时间.每次选择机器从小到大开 ...
- Codeforces 740A. Alyona and copybooks 模拟
A. Alyona and copybooks time limit per test: 1 second memory limit per test: 256 megabytes input: st ...
随机推荐
- UVA - 294 Divisors (约数)(数论)
题意:输入两个整数L,U(1<=L<=U<=109,U-L<=10000),统计区间[L,U]的整数中哪一个的正约数最多.如果有多个,输出最小值. 分析: 1.求一个数的约数, ...
- 每天一点点之laravel框架 - Laravel5.6 + Passport实现Api接口认证
1.首先通过 Composer 包管理器安装 Passport: composer require laravel/passport 注:如果安装过程中提示需要更高版本的 Laravel:larave ...
- java web实现在线编辑word,并将word导出(二)
前一篇文章介绍了后台将前台html转为word文档的一种方式,但却有一个问题是没法讲图片放置在生成的word报告中.我在网上找了很多方法,甚至将图片转换成base64编码的方式也不成功.效果如下: 由 ...
- vue实现CheckBox与数组对象绑定
实现需求: 实现一个简易的购物车,页面的表格展示data数据中的一个数组对象,并提供选中商品和全选商品checkbox复选框,页面实时显示选中商品的总金额: 分析: 1:使用v-for循环渲染arra ...
- Java基础查漏补缺(2)
Java基础查漏补缺(2) apache和spring都提供了BeanUtils的深度拷贝工具包 +=具有隐形的强制转换 object类的equals()方法容易抛出空指针异常 String a=nu ...
- promise 核心 几个小问题
1.如何改变pending的壮体 抛出异常.pending变为rejected // throw new Error('fail') 内部抛出异常也这样 reason为抛出的error resol ...
- HDU 5423:Rikka with Tree Dijkstra算法
Rikka with Tree Accepts: 207 Submissions: 815 Time Limit: 2000/1000 MS (Java/Others) Memory Limi ...
- Tensorflow学习教程------代价函数
Tensorflow学习教程------代价函数 二次代价函数(quadratic cost): 其中,C表示代价函数,x表示样本,y表示实际值,a表示输出值,n表示样本的总数.为简单起见,使用一 ...
- python里的property修饰器
在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9999 这显然不合逻辑.为了限制score的 ...
- leetcode算法题121-123 --78 --python版本
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序. 实例输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组上操作,不能 ...