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 - 1615 Highway(高速公路)(贪心+区间选点)
题意:给定平面上n(n<=105)个点和一个值D,要求在x轴上选出尽量少的点,使得对于给定的每个点,都有一个选出的点离它的欧几里德距离不超过D. 分析: 1.根据D可以算出每个点在x轴上的可选区 ...
- POJ 2593&&2479:Max Sequence
Max Sequence Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 16329 Accepted: 6848 Des ...
- 【golang】golang文本处理
golang文本字符串操作:包含 合并 连接 分割 取索引 前缀后缀检测 消除字符串 消除空格 golang字符串操作需要用到 strings这个包 str := "hello world& ...
- monkey命令详解《转载》
monkey命令详解: https://blog.csdn.net/a136332462/article/details/76014412
- Dynamics CRM - 解决无法使用 Ribbon Workbench 2016 定制 Sub-Grid View Button 的问题(SubGrid MainTab 消失之谜)
发现问题: 在 Dynamics CRM 开发中,会经常使用 Ribbon Workbench 工具来定制 Button 或者对已有 Button 进行自定义功能开发,比如隐藏 SubGrid 的 A ...
- JS隔行换色和全选的实现
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- kuangbin专题——简单搜索
A - 棋盘问题 POJ - 1321 题意 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大 ...
- SpringMVC:拦截器
SpringMVC:拦截器 概述 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.开发者可以自己定义一些拦截器来实现特定的功能. 过 ...
- python try-except处理异常的常用方法分析
在写python程序时遇到异常想要进行处理时,可以使用try-except来处理,例如: try: 语句1 语句2 . . 语句N except .........: do something ... ...
- 51nod 1393:0和1相等串
1393 0和1相等串 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等. I ...