• 【搜索+思维】Distinctive Character


    题目描述

    Tira would like to join a multiplayer game with n other players. Each player has a character with some features. There are a total of k features, and each character has some subset of them. 
    The similarity between two characters A and B is calculated as follows: for each feature f, if both A and B have feature f or if none of them have feature f, the similarity increases by one.
    Tira does not have a character yet. She would like to create a new, very original character so that the maximum similarity between Tira’s character and any other character is as low as possible.
    Given the characters of the other players, your task is to create a character for Tira that fulfils the above requirement. If there are many possible characters, you can choose any of them.

    输入

    The first line of input contains two integers n and k, where 1 ≤ n ≤ 105 is the number of players (excluding Tira) and 1 ≤ k ≤ 20 is the number of features. 
    Then follow n lines describing the existing characters. Each of these n lines contains a string of k digits which are either 0 or 1. A 1 in position j means the character has the j’th feature, and a 0 means that it does not have the j’th feature.

    输出

    Output a single line describing the features of Tira’s character in the same format as in the input.
    If there are multiple possible characters with the same smallest maximum similarity, any one of them will be accepted. 

    样例输入

    3 5
    01001
    11100
    10111
    

    样例输出

    00010

    思路:

      首先对于一个串(假设10110),对于它能走到的串有5个分别是,00110,11110,10010,10100,10111,也就是只有一位与原串不一样的串。然后我们对于所有的源串,我们bfs,找到(1<<20)个串中,距离这些源串最远的串,就是匹配数目最大值最小的串。

    代码如下:

     1 #include <iostream>
     2 #include <bits/stdc++.h>
     3 using namespace std;
     4 const int maxn = (1<<20) ;
     5 queue<int> q;
     6 int d[maxn];
     7 string str;
     8 inline int read()                                //读入优化
     9 {
    10     int x=0,f=1;
    11     char c=getchar();
    12     while (!isdigit(c))
    13         f=c=='-'?-1:1,c=getchar();
    14     while (isdigit(c))
    15         x=(x<<1)+(x<<3)+(c^48),c=getchar();
    16     return x*f;
    17 }
    18 int n,k,maxx,als;
    19 void solve(){
    20     while(!q.empty())
    21     {
    22         int now=q.front();
    23         q.pop();
    24         for(int i=0;i<k;i++)
    25         {
    26             int nxt=now^(1<<i);
    27             if(d[nxt]!=-1)
    28                 continue;
    29             q.push(nxt);
    30             d[nxt]=d[now]+1;
    31             if(d[nxt]>maxx)
    32             {
    33                 maxx=d[nxt];
    34                 als=nxt;
    35             }
    36         }
    37     }
    38 }
    39 void output()
    40 {
    41     int a[20];
    42     for(int i=0;i<k;i++)
    43     {
    44         a[i]=als%2;
    45         als/=2;
    46     }
    47     for(int i=0;i<k;i++)
    48     {
    49         printf("%d",a[i]);
    50     }
    51     cout << endl;
    52 }
    53 int main()
    54 {
    55     n=read(),k=read();
    56     memset(d,-1,sizeof(d));
    57     for(int i=1;i<=n;i++)
    58     {
    59         cin>>str;
    60         int num=0;
    61         for(int i=0;i<k;i++)
    62         {
    63             if(str[i]=='1'){
    64                 num|=(1<<i);
    65             }
    66         }
    67         q.push(num);
    68         d[num]=0;
    69     }
    70     maxx=-1;
    71     solve();
    72     output();
    73     //cout << "Hello world!" << endl;
    74     return 0;
    75 }
    View Code
     
  • 相关阅读:
    数列分块入门 1-8
    最远点对 [线段树+树的直径]
    实验室外的攻防战 UOJ#180 [树状数组]
    二叉搜索树 [四边形不等式优化区间dp]
    树上的等差数列 [树形dp]
    序列 [树状数组+离散化]
    ATcoder1983 BBQ Hard
    8.18日报
    8.17日报
    8.16日报
  • 原文地址:https://www.cnblogs.com/SoulSecret/p/9601531.html
Copyright © 2020-2023  润新知