CodeForces 993B Open Communication(STL 模拟)

https://codeforces.com/problemset/problem/993/b

题意:

现在有两个人,每个人手中有两个数,其中两个人手中的数有一个是相同的(另一个不一样),

现在第一个人会给你n对数,保证其中一对就是他手上的两个数,第二个人会给你m对数,保证其中一对是他手上的两个数。

现在你作为一个旁观者,如果能分辨出相同的数,则输出它,如果你知道手上有牌的人知道相同的数,那么输出0,其余则输出-1。

思路:

其实就是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。

注意:要跑两遍

代码如下:

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <iostream>
  4 #include <string>
  5 #include <math.h>
  6 #include <algorithm>
  7 #include <vector>
  8 #include <stack>
  9 #include <queue>
 10 #include <set>
 11 #include <map>
 12 #include <sstream>
 13 const int INF=0x3f3f3f3f;
 14 typedef long long LL;
 15 const int mod=1e9+7;
 16 //const double PI=acos(-1);
 17 #define Bug cout<<"---------------------"<<endl
 18 const int maxn=1e5+10;
 19 using namespace std;
 20
 21 vector<pair<int,int> > vt1;
 22 vector<pair<int,int> > vt2;
 23
 24 int main()
 25 {
 26     int n,m;
 27     scanf("%d %d",&n,&m);
 28     for(int i=1;i<=n;i++)
 29     {
 30         int x,y;
 31         scanf("%d %d",&x,&y);
 32         vt1.push_back(make_pair(min(x,y),max(x,y)));
 33     }
 34     for(int i=1;i<=m;i++)
 35     {
 36         int x,y;
 37         scanf("%d %d",&x,&y);
 38         vt2.push_back(make_pair(min(x,y),max(x,y)));
 39     }
 40     int f1[10]={0};
 41     int tag=0;//判断一组中两个数是否均为共享数字
 42     for(vector<pair<int,int> >::iterator it1=vt1.begin();it1!=vt1.end();it1++)
 43     {
 44         int a=it1->first;
 45         int b=it1->second;
 46         int f[2]={0};//看该组两个数字是否均为共享数字
 47         for(vector<pair<int,int> >::iterator it2=vt2.begin();it2!=vt2.end();it2++)
 48         {
 49             int c=it2->first;
 50             int d=it2->second;
 51             if(a==c&&b==d)
 52                 continue;
 53             if(a==c&&b!=d)
 54             {
 55                 f1[a]++;
 56                 f[0]=1;
 57             }
 58             else if(b==c)
 59             {
 60                 f1[b]++;
 61                 f[1]=1;
 62             }
 63             else if(a==d)
 64             {
 65                 f1[a]++;
 66                 f[0]=1;
 67             }
 68             else if(b==d)
 69             {
 70                 f1[b]++;
 71                 f[1]=1;
 72             }
 73         }
 74         if(f[0]&&f[1])
 75             tag=1;
 76     }
 77     int f2[10]={0};
 78     for(vector<pair<int,int> >::iterator it1=vt2.begin();it1!=vt2.end();it1++)//再从第二个人跑一遍
 79     {
 80         int a=it1->first;
 81         int b=it1->second;
 82         int f[2]={0};
 83         for(vector<pair<int,int> >::iterator it2=vt1.begin();it2!=vt1.end();it2++)
 84         {
 85             int c=it2->first;
 86             int d=it2->second;
 87             if(a==c&&b==d)
 88                 continue;
 89             if(a==c&&b!=d)
 90             {
 91                 f2[a]++;
 92                 f[0]=1;
 93             }
 94             else if(b==c)
 95             {
 96                 f2[b]++;
 97                 f[1]=1;
 98             }
 99             else if(a==d)
100             {
101                 f2[a]++;
102                 f[0]=1;
103             }
104             else if(b==d)
105             {
106                 f2[b]++;
107                 f[1]=1;
108             }
109         }
110         if(f[0]&&f[1])
111             tag=1;
112     }
113     int num=0;
114     int ans=0;
115     for(int i=1;i<=9;i++)
116     {
117         if(f1[i])
118         {
119             num++;
120             ans=i;
121         }
122     }
123     if(tag)
124         printf("-1\n");
125     else
126     {
127         if(num==1)
128             printf("%d\n",ans);
129         else
130             printf("0\n");
131     }
132     return 0;
133 }

原文地址:https://www.cnblogs.com/jiamian/p/11708145.html

时间: 2024-10-15 11:56:18

CodeForces 993B Open Communication(STL 模拟)的相关文章

Codeforces 528A Glass Carving STL模拟

题目链接:点击打开链接 题意: 给定n*m的矩阵,k个操作 2种操作: 1.H x 横向在x位置切一刀 2.V y 竖直在y位置切一刀 每次操作后输出最大的矩阵面积 思路: 因为行列是不相干的,所以只要知道每次操作后行的最大间距和列的最大间距,相乘就是最大面积 用一个set维护横向的所有坐标点,一个multiset维护横向的间距. 每次对行操作x则在set中找到比x大的最小数 r 和比x小的最大数l ,操作前的间距dis = r-l,在multiset中删除dis并插入r-x 和x-l.再在se

HDU 4028 The time of a day STL 模拟题

暴力出奇迹.. #include<stdio.h> #include<iostream> #include<algorithm> #include<vector> #include<cmath> #include<queue> #include<set> #include<map> using namespace std; #define ll __int64 #define N 42 ll n,m,ans;

Codeforces 475C Kamal-ol-molk&#39;s Painting 模拟

题目链接:点击打开链接 题意:给定n*m的矩阵 X代表有色 .代表无色 用一个x*y的矩阵形刷子去涂色. 刷子每次可以→或↓移动任意步. 若能够染出给定的矩阵,则输出最小的刷子的面积 若不能输出-1 思路: 先找到连续最小的x,y 因为至少一个边界和x或y相等,所以枚举(x,i) 和 (i,y)就可以了. #pragma comment(linker, "/STACK:102400000,102400000") #include <stdio.h> #include <

HDU 4022 Bombing STL 模拟题

手动模拟.. #include<stdio.h> #include<iostream> #include<algorithm> #include<vector> #include<cmath> #include<queue> #include<set> #include<map> using namespace std; #define N 10100 #define inf 1000000010 map<

stl+模拟 CCF2016 4 路径解析

1 // stl+模拟 CCF2016 4 路径解析 2 // 一开始题意理解错了.... 3 4 #include <iostream> 5 #include <string> 6 #include <vector> 7 using namespace std; 8 void fre() {freopen("in.txt","r",stdin);} 9 vector<string> l; 10 int main(){

Codeforces 30D King&#39;s Problem? 模拟

首先将n个点排序,找出排序后的K,然后分情况讨论. 当 k == n+1时,显然是 k->1->n || k->n->1这两种的较小值,因为三角形的两边之和大于第三边. 当1 <= k && k <= n 时: 1 , k -> 1 -> n+1 -> k+1 ->n  ||  k -> n -> n+1 -> k-1 -> 1,当k+1 || k-1 不存在时将对应步骤忽略. 2 , k - > 1

[Codeforces 1246B] Power Products (STL+分解质因数)

[Codeforces 1246B] Power Products (STL+分解质因数) 题面 给出一个长度为\(n\)的序列\(a_i\)和常数k,求有多少个数对\((i,j)\)满足\(a_i \times a_j = x^k (x \in \mathbb{N}^+)\).即这两个数乘起来恰好为一个正整数的\(k\)次方 \(a_i,n \leq 10^5\) 分析 考虑\(x^k\)的质因数分解式 , 那么每一项的指数一定是k的倍数,即 \(k|x_i\). 因此对于每个 \(a_i\)

Codeforces 747C:Servers(模拟)

http://codeforces.com/problemset/problem/747/C 题意:有n台机器,q个操作.每次操作从ti时间开始,需要ki台机器,花费di的时间.每次选择机器从小到大开始,如果可以完成任务,那么输出id总和,否则输出-1. 思路:简单的模拟,注意如果不能完成任务,那么ser数组是不能更新的. 1 #include <cstdio> 2 #include <algorithm> 3 #include <iostream> 4 #includ

CodeForces 670 A. Holidays(模拟)

Description On the planet Mars a year lasts exactly n days (there are no leap years on Mars). But Martians have the same weeks as earthlings — 5 work days and then 2 days off. Your task is to determine the minimum possible and the maximum possible nu