0
点赞
收藏
分享

微信扫一扫

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


题目链接:​​点击打开链接​​


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

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

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

AC 代码

#include<bits/stdc++.h>

#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<string> vec;
map<string,int> mp;
int rrr[5000000];

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

int cmp(Peo p1,Peo p2)
{
return p1.val<p2.val;
}

int lbcmp(Peo p1,Peo p2)
{
return p1.val<p2.val;
}

int main()
{
int T; scanf("%d",&T);
while(T-- && ~scanf("%d%d",&n,&q))
{
init();
int c; scanf("%d",&c);
Peo ps[c+10];
int nameCnt=c;
char name[50];
for(int i=0;i<c;i++) // 初始化
{
scanf("%s",name);
// memset(mp[name].vrr,0,sizeof mp[name].vrr);
mem(ps[i].vrr,0);
ps[i].idx=i;
ps[i].val=0;
strcpy(ps[i].name,name);
// vec.push_back(name);
mp[name]=i;
}

for(int i=0;i<q;i++)
{
scanf("%d",&c);
for(int j=0;j<c;j++)
{
scanf("%s",name);
// mp[name].vrr[i]=1;
ps[mp[name]].vrr[i]=1; // 没有赋值为 1 的,则是 0
}
}

for(int i=0;i<nameCnt;i++)
{
int sum=0,two=1;
for(int j=q-1;j>=0;j--) // B2D
sum+=two*ps[i].vrr[j],two<<=1;

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

// for(int i=0;i<nameCnt;i++)
// {
// printf("%s == %d\n",ps[i].name,ps[i].val);
// }

int trr[q];
for(int i=0;i<n;i++)
{
for(int j=0;j<q;j++)
{
scanf("%d",&trr[j]);
}

int sum=0,two=1;
for(int j=q-1;j>=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;i<n;i++)
// {
// for(int j=0;j<q;j++)
// scanf("%d",&trr[j]);
//
// int tmp[q],cnt=0,ans=-1;
// for(int j=0;j<nameCnt;j++)
// {
//
// for(int k=0;k<q;k++)
// {
// tmp[k]=mp[vec[j]].vrr[k];
// }
//
// int flag=1;
// for(int k=0;k<q;k++)
// {
// if(tmp[k]!=trr[k])
// {
// flag=0;
// break;
// }
// }
//
// if(flag)
// {
// cnt++;
// ans=j;
// }
// }
//
// if(cnt==0 || cnt>1)
// puts("Let's go to the library!!");
// else if(cnt==1)
// printf("%s\n",vec[ans].c_str());
// }
}

return 0;
}


举报

相关推荐

0 条评论