浙江省赛 C What Kind of Friends Are You?
思路:一开始考虑n个朋友可以有c种可能,根据回答的问题,如果是yes那么可以确定一些朋友的范围,将原本不在这个范围内的删除即可;如果是“no”,说明这些朋友都应该被删除,那么最后看第i个人候选的情况是不是只有一种,如果是直接输出名字,否则就是不确定或者不存在。下面介绍利用贡献优化,并且非常好写的方法。
AC代码
#include <cstdio>
#include <cmath>
#include <cctype>
#include <algorithm>
#include <cstring>
#include <utility>
#include <string>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define eps 1e-10
#define inf 0x3f3f3f3f
#define PI pair<int, int>
typedef long long LL;
const int maxn = 200 + 5;
string name[maxn];
int vis[maxn][maxn];
int a[maxn][maxn];
map<string, int>ha;
int getId(string p) {
return ha[p];
}
int main() {
int T, n, q, c;
scanf("%d", &T);
while(T--) {
ha.clear();
scanf("%d%d", &n, &q);
scanf("%d", &c);
for(int i = 0; i < c; ++i) {
cin >> name[i];
ha[name[i]] = i;
}
vector<int>que[maxn];
memset(vis, 0, sizeof(vis));
for(int i = 0; i < q; ++i) {
int m;
scanf("%d", &m);
string s;
for(int j = 0; j < m; ++j) {
cin >> s;
que[i].push_back(getId(s));
}
}
for(int i = 0; i < n; ++i) {
for(int j = 0; j < c; ++j) vis[i][j] = 1;
for(int j = 0; j < q; ++j) {
scanf("%d", &a[i][j]);
if(a[i][j]) {
for(int k = 0; k < c; ++k) if(vis[i][k]) {
int f = 0;
for(int h = 0; h < que[j].size(); ++h) {
if(que[j][h] == k) {
f = 1;
break;
}
}
if(!f) vis[i][k] = 0;
}
}
else {
for(int k = 0; k < que[j].size(); ++k) {
vis[i][que[j][k]] = 0;
}
}
}
}
for(int i = 0; i < n; ++i) {
int cnt = 0;
int ind;
for(int j = 0; j < c; ++j) {
if(vis[i][j]) {
++cnt;
ind = j;
}
}
if(cnt == 1) {
cout << name[ind] << endl;
}
else printf("Let's go to the library!!\n");
}
}
return 0;
}
更好的思路:每一个人被每一个问题赋予了一定的贡献,第i个问题的贡献是2^i(二进制)。
例如:
4 Serval Raccoon Alpaca Moose
1 Serval
1 Fennec
1 Serval
第一个问题对Serval Raccoon Alpaca Moose四人的贡献为2^0,
第二个问题对Serval贡献为2^1,下面的问题同理;“”
最后根据对问题的回答情况,确定第i(0 < i < n)人的贡献,查找人名中是否有唯一与之对应的,如果有输出人名,否则输出“Let's go to the library!!”,时间复杂度为O(n*c)。这种方法非常巧妙,降低了复杂度。
AC代码
#include <cstdio>
#include <cmath>
#include <cctype>
#include <algorithm>
#include <cstring>
#include <utility>
#include <string>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define eps 1e-10
#define inf 0x3f3f3f3f
#define PI pair<int, int>
typedef long long LL;
const int maxn = 200 + 5;
string name[maxn];
map<string, int>ha;
int w[30], g[maxn];
void init() {
w[0] = 1;
for(int i = 1; i <= 25; ++i) w[i] = w[i-1] * 2;
}
int main() {
init();
int T, n, q, c;
scanf("%d", &T);
while(T--) {
ha.clear();
scanf("%d%d", &n, &q);
scanf("%d", &c);
for(int i = 0; i < c; ++i) {
cin >> name[i];
ha[name[i]] = i;
g[i] = 0;
}
for(int i = 0; i < q; ++i) {
string s;
int m;
scanf("%d", &m);
while(m--) {
cin >> s;
g[ha[s]] += w[i];
}
}
for(int i = 0; i < n; ++i) {
int sum = 0;
for(int j = 0; j < q; ++j) {
int f;
scanf("%d", &f);
if(f) sum += w[j];
}
int cnt = 0, peo;
for(int j = 0; j < c; ++j) {
if(g[j] == sum) {
++cnt;
peo = j;
}
}
if(cnt == 1) cout << name[peo] << endl;
else printf("Let's go to the library!!\n");
}
}
return 0;
}
由于测试数据不够强,导致二种方法时间相差不大:强烈建议掌握第二种的思路。
如有不当之处欢迎指出!
浙江省赛 C What Kind of Friends Are You?的更多相关文章
- ZOJ 3879 Capture the Flag 15年浙江省赛K题
每年省赛必有的一道模拟题,描述都是非常的长,题目都是蛮好写的... sigh... 比赛的时候没有写出这道题目 :( 题意:首先输入4个数,n,q,p,c代表有n个队伍,q个服务器,每支队伍的初始分数 ...
- The 13th Zhejiang Provincial Collegiate Contest(2016年浙江省赛)
前4道水题就不说了,其中我做了C题,1Y,小心仔细写代码并且提交之前得确认无误后提交才能减少出错率. 结果后面2题都由波神做掉,学长带我们飞~ 终榜 官方题解 ZOJ 3946 Highway ...
- ZOJ 3872 Beauty of Array DP 15年浙江省赛D题
也是一道比赛时候没有写出来的题目,队友想到了解法不过最后匆匆忙忙没有 A 掉 What a pity... 题意:定义Beauty数是一个序列里所有不相同的数的和,求一个序列所有字序列的Beauty和 ...
- (2017浙江省赛E)Seven Segment Display
Seven Segment Display Time Limit: 2 Seconds Memory Limit: 65536 KB A seven segment display, or ...
- 浙江省赛之Singing Everywhere
题目:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5996 方法: 在大佬的指导下完成. 寻找峰值,找到一共k个 ...
- 2019浙江省赛B zoj4101 Element Swapping(推公式)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6003 题意 \(数组a通过交换一对数字,得到了b数组,给出x=\sum^n_{ ...
- 2019浙江省赛K zoj4110 Strings in the Pocket(manachar)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6012 题意 给你两个串,可以翻转a串的一个区间,问有多少对l,r使得翻转后的a ...
- 140 - The 12th Zhejiang Provincial Collegiate Programming Contest(浙江省赛2015)
Ace of Aces Time Limit: 2 Seconds Memory Limit: 65536 KB There is a mysterious organization c ...
- 浙江省赛 ZOJ4029
Now Loading!!! Time Limit: Second Memory Limit: KB DreamGrid has integers . DreamGrid also has queri ...
随机推荐
- 【Code clone】Distributed Code Clone Detection Based on Index
1 摘要 随着软件产业的发展,代码克隆现象越来越常见,随之带来的安全漏洞.可维护性.产权等问题也引起人们重视.代码克隆按照复制程度分为4类:完全复制.修改名称.更换顺序和自实现.现有的代码克隆检测工 ...
- 可等待计时器添加APC测试
可等待计时器和用户计时器的最大区别在于用户计时器需要在应用程序中使用大量的用户界面基础设施,从而消耗更多的资源.此外,可等待计时器是内核对象,这意味着他们不仅可以在多个线程间共享,而且具备安全性. 用 ...
- 移动端 -webkit-user-select:text; ios10 bug 解决方案
移动端一般body的css.会设置 作用就不解释了: body{ height:100%;min-height:100%; font-family: "微软雅黑",'Helveti ...
- getResource()和getSystemResource()分析
1. getClass().getResource() 第一步,getClass().getResource(path)是有一个路径参数的,这个路径会先被转换成"类所在的包名称+path&q ...
- org.json.JSONObject的optXXX方法
JSONObject有很多optXXX方法,比如optBoolean,optString,optInt.... 他们的意思是:如果这个JSONObject对象,如果有返回这个属性的值,如果没有返回一个 ...
- func_get_args 获取一个函数的所有参数
func_get_args 获取一个函数的所有参数 { $numargs = func_num_args(); //参数数量 echo "参数个数是: $numargs&l ...
- java to kotlin (2) - lambda编程
前言 Kotlin Note 是我学习kotlin整理笔记向博客,文章中的例子参考了kotlin in action这本书籍,同时我也极力推荐这本书,拥有Java基础的人可以很快的就使用kotlin来 ...
- MySQL--pt-osc工具学习
##=====================================================##pt-osc之工作流程:1.检查更改表是否有主键或唯一索引,是否有触发器2.检查修改表 ...
- Bug等级判断标准
测试的问题大致可分为以下几个类型:致命问题严重问题一般问题轻微问题 判断标准如下1.致命问题:造成系统崩溃.死机.死循环,导致数据库数据丢失,与数据库连接错误,主要功能丧失,基本模块缺失等问题.如:代 ...
- 性能测试监控:Jmeter +InfluxDB +collectd +Grafana
虚拟机ip 192.168.180.128 Influxdb Influxdb是一个开源的分布式时序.时间和指标数据库,使用go语言编写,无需外部依赖. 它有三大特性: 时序性(Time Series ...