zoukankan      html  css  js  c++  java
  • 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;

    注意:两个人都要遍历对方一遍

    代码如下:

      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     //输入
     29     for(int i=1;i<=n;i++)
     30     {
     31         int x,y;
     32         scanf("%d %d",&x,&y);
     33         vt1.push_back(make_pair(min(x,y),max(x,y)));//pair的first中为小的数 
     34     }
     35     for(int i=1;i<=m;i++)
     36     {
     37         int x,y;
     38         scanf("%d %d",&x,&y);
     39         vt2.push_back(make_pair(min(x,y),max(x,y)));
     40     }
     41     int f1[10]={0};
     42     int tag=0;//判断一组中两个数是否均为共享数字  
     43     for(vector<pair<int,int> >::iterator it1=vt1.begin();it1!=vt1.end();it1++)//遍历第一个人 
     44     {
     45         int a=it1->first;//第一个人这对数中的较小值 
     46         int b=it1->second;//第一个人这对数中的较大值 
     47         int f[2]={0};//看该组两个数字是否均为共享数字
     48         for(vector<pair<int,int> >::iterator it2=vt2.begin();it2!=vt2.end();it2++)
     49         {
     50             int c=it2->first;//第二个人这对数中的较小值 
     51             int d=it2->second;//第二个人这对数中的较大值 
     52             if(a==c&&b==d)
     53                 continue;
     54             if(a==c&&b!=d)
     55             {
     56                 f1[a]++;//共享数字a出现次数增加 
     57                 f[0]=1;//第一个数为共享数字 
     58             }
     59             else if(b==c)
     60             {
     61                 f1[b]++;//共享数字b出现次数增加
     62                 f[1]=1;//第二个数为共享数字
     63             }
     64             else if(a==d)
     65             {
     66                 f1[a]++;//共享数字a出现次数增加 
     67                 f[0]=1;//第一个数为共享数字 
     68             }
     69             else if(b==d)
     70             {
     71                 f1[b]++;//共享数字b出现次数增加
     72                 f[1]=1;//第二个数为共享数字
     73             }
     74         }
     75         if(f[0]&&f[1])//如果第一个人该组数字两个数均为共享数字,结果为-1 
     76             tag=1;
     77     }
     78     int f2[10]={0};//其实没用 
     79     for(vector<pair<int,int> >::iterator it1=vt2.begin();it1!=vt2.end();it1++)//再从第二个人跑一遍
     80     {
     81         int a=it1->first;
     82         int b=it1->second;
     83         int f[2]={0};
     84         for(vector<pair<int,int> >::iterator it2=vt1.begin();it2!=vt1.end();it2++)
     85         {
     86             int c=it2->first;
     87             int d=it2->second;
     88             if(a==c&&b==d)
     89                 continue;
     90             if(a==c&&b!=d)
     91             {
     92                 f2[a]++;
     93                 f[0]=1;
     94             }
     95             else if(b==c)
     96             {
     97                 f2[b]++;
     98                 f[1]=1;
     99             }    
    100             else if(a==d)
    101             {
    102                 f2[a]++;
    103                 f[0]=1;
    104             }
    105             else if(b==d)
    106             {
    107                 f2[b]++;
    108                 f[1]=1;    
    109             }
    110         }
    111         if(f[0]&&f[1])
    112             tag=1;
    113     }
    114     int num=0;//共享数字的个数 
    115     int ans=0;//如果共享数字只有一个,ans则为该共享数字 
    116     for(int i=1;i<=9;i++)
    117     {
    118         if(f1[i])
    119         {
    120             num++;
    121             ans=i;
    122         }
    123     }
    124     if(tag)
    125         printf("-1
    ");
    126     else
    127     {
    128         if(num==1)//共享数字有且只有一个 
    129             printf("%d
    ",ans);
    130         else//共享数字有多个
    131             printf("0
    "); 
    132     }
    133     return 0;
    134 }
  • 相关阅读:
    分布式和集群
    c++ >>
    c++ ip地址相关
    c++ ip地址的操作 c版
    c++ 缺少动态库
    c++ dirname() basename()
    shell ulimit -n
    shell 进程查询相关的命令
    shell grep 高亮
    c++ swap 函数
  • 原文地址:https://www.cnblogs.com/jiamian/p/11708145.html
Copyright © 2011-2022 走看看