ZOJ - Problem Set - 3960 What Kind of Friends Are You?

题目链接:点击打开链接

 

题目大意:根据人的回答问题的答案完全匹配上,当且仅当只有一位匹配上,则该朋友已鉴定(已找到),否则没有匹配上或者多个匹配上都算无法鉴定(未找到)。如图。

ZOJ - Problem Set - 3960 What Kind of Friends Are You?_第1张图片

 

解题思路:首先利用 map、结构体 来数据初始化,通过 B2D (否则数据溢出)来映射,并且统计数组 rrr[maxn] + sort结构体 + lower_bound二分查找。

 

AC 代码

#include

#define mem(a,b) memset(a,b,sizeof a);

using namespace std;

typedef long long ll;

struct Peo
{
    char name[50];
    int vrr[50],idx,val;
};

int n,q;
//vector vec;
map mp;
int rrr[5000000];

void init()
{
    mp.clear();
    mem(rrr,0);
//    vec.clear();
}

int cmp(Peo p1,Peo p2)
{
    return p1.val=0;j--) // B2D
                sum+=two*ps[i].vrr[j],two<<=1;

            rrr[sum]++; // 为了匹配时统计当且仅当存在一位朋友
            ps[i].val=sum; // 为了sort排序,二分查找
        }

//        for(int i=0;i=0;j--) // B2D
            {
                sum+=two*trr[j],two<<=1;
            }
            Peo psum; // 为了与 lbcmp函数 语法对齐
            psum.val=sum;

            sort(ps,ps+nameCnt,cmp); // 根据 val 从小到大排序

            if(rrr[sum]==1) // 排除了找不到或者找到多个的情况
            {
                printf("%s\n",ps[lower_bound(ps,ps+nameCnt,psum,lbcmp)-ps].name);
            }
            else
            {
                puts("Let's go to the library!!");
            }

        }

//        TLE 常规思路
//        int trr[q];
//        for(int i=0;i1)
//                puts("Let's go to the library!!");
//            else if(cnt==1)
//                printf("%s\n",vec[ans].c_str());
//        }
    }

    return 0;
}

你可能感兴趣的:(#,ACM,#,ZOJ,#,模拟题集)