浙江省赛 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 ...
随机推荐
- [搬运] .NET Core 2.1中改进的堆栈信息
原文 : Stacktrace improvements in .NET Core 2.1 作者 : Ben Adams 译者 : 张很水 . NET Core 2.1 现在具有可读的异步堆栈信息!使 ...
- 使用keepAlive对上下拉刷新列表数据 和 滚动位置细节处理 - vue
[前言] 使用vue处理项目中遇到列表页面时,之前项目中总会有一些细节问题处理得不太好,这里总结一下,以便优化以后的代码.如下: 1. 使用mint-ui中的LoadMore组件上下拉刷新时,有时无法 ...
- 【转】UNIX时间戳与.net日期类的转换
1 将系统时间转换成UNIX时间戳 DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970,1,1)); ...
- DAY11-Java中的类--接上篇
一.用户自定义类 1.写先出一个简单的Employee类作为例子说明. 代码如下: import java.time.LocalDate; /** * 自定义方法练习--测试 这个程序中包含了两个类E ...
- Power shell 重启IIS
最近根据项目需要写了一段power shell的代码 ,主要功能是批量重启IIS 具体的 Power shell 服务如下: write-output 'Restarting IIS servers ...
- ABP官方文档翻译 6.3 本地化
本地化 介绍 应用程序语言 本地化源 XML文件 注册XML本地化源 JSON文件 注册JSON本地化源 资源文件 自定义源 当前语言是如何决定的 ASP.NET Core ASP.NET MVC 5 ...
- require和require_once的区别
require 的使用方法如 require("./inc.php"); .通常放在 PHP 程式的最前面,PHP 程式在执行前,就会先读入 require 所指定引入的档案,使它 ...
- 深入理解Python字符编码--转
http://blog.51cto.com/9478652/2057896 不论你是有着多年经验的 Python 老司机还是刚入门 Python 不久,你一定遇到过UnicodeEncodeError ...
- HDU [P3605] Escape
二分图多重匹配 改进版的匈牙利,加入了一个cnt数组作为找到增广路的标志 本题有一个重要的优化见注释 #include <iostream> #include <cstdio> ...
- POJ置换群入门[3/3]
POJ 3270 Cow Sorting 题意: 一个序列变为升序,操作为交换两个元素,代价为两元素之和,求最小代价 题解: 看了黑书... 首先循环因子分解 一个循环完成的最小代价要么是循环中最小元 ...