AcWing第85场周赛
这场周赛是手速局hh
死或生
某国正在以投票的方式决定 2 名死刑犯(编号 1∼2)的生死。
共有 n 组人员(编号 1∼n)参与投票,每组 10 人。
每组成员只参与一名死刑犯的投票,其中第 i 组人员的投票对象是死刑犯 ti,其中 xi 人认为他无罪,yi 人认为他有罪。
在所有人员投票结束后,将对投票结果进行统计。
对于每名死刑犯,如果投他无罪的总票数大于或等于投他有罪的总票数,则他得以生还,否则他将被处死。
请你判断每名死刑犯的生死。
输入格式
第一行包含一个整数 n。
接下来 n 行,每行包含三个整数 ti,xi,yi。
保证两名犯人都会被投票。
输出格式
如果第一位死刑犯生还,则在第一行输出 LIVE,否则在第一行输出 DEAD。
如果第二位死刑犯生还,则在第二行输出 LIVE,否则在第二行输出 DEAD。
数据范围
\(前 3 个测试点满足 2≤n≤10。\)
\(所有测试点满足 2≤n≤1000,1≤ti≤2,0≤xi,yi≤10,xi+yi=10。\)
输入样例1:
2
1 5 5
2 6 4
输出样例1:
LIVE
LIVE
输入样例2:
3
1 0 10
2 0 10
1 10 0
输出样例2:
LIVE
DEAD
简单的枚举即可,借助哈希表记录无罪票数和有罪票数
#include <bits/stdc++.h>
using namespace std;
int a[3],b[3];
int n;
int main()
{
cin>>n;
while (n--)
{
int t,x,y;
cin>>t>>x>>y;
a[t]+=x;
b[t]+=y;
}
for (int i=1;i<=2;i++)
if (a[i]>=b[i])
puts("LIVE");
else puts("DEAD");
return 0;
}
最大价值
已知,小写字母 a∼z 的价值分别为$ w_a,w_b,…,w_z$。
对于一个由小写字母构成的长度为 l 的字符串 \(S=s_1,s_2…s_l,其价值为 w_{s1}×1+w_{s2}×2+…+w_{sl}×l\)。
现在,给定一个由小写字母构成的字符串 S,请你在这个字符串中插入 k 个小写字母,要求最终得到的字符串的价值尽可能大。
注意:
- 插入的位置可以随意选。
- 插入的字母也可以随意选,可以插入不同字母。
输出最大可能价值。
输入格式
第一行包含一个字符串 S。
第二行包含一个整数 k。
第三行包含 26 个整数 \(w_a,w_b,…,w_z\)。
输出格式
一个整数,表示最大可能价值。
数据范围
前 3 个测试点满足,S 的长度范围 [1,5]。
所有测试点满足,S 的长度范围 [1,1000],\(0≤k≤10^3\),\(w_a∼w_z\) 的取值范围 [0,1000]。
输入样例:
abc
3
1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
输出样例:
41
贪心即可,经过证明(很好证)要得到最大价值,插入方法即在尾部插入k个单个价值的最大的字母
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
string s;
int w[N];
int k;
typedef long long LL;
int main()
{
cin>>s>>k;
int res=0;
for (int i=0;i<26;i++)
cin>>w[i],res=max(res,w[i]);
LL ans=0;
for (int i=0;i<s.size();i++)
ans+=(w[s[i]-'a']*(i+1)); // 这里一定要记着-'a'啊!血的教训,这细节要注意!
int len=s.size();
for (int i=len+1;i<=k+len;i++)
{
ans+=res*i;
}
cout<<ans<<endl;
return 0;
}
危险程度
有 n 种化学物质,编号 1∼n。
其中,有 m 对物质之间会发生反应。
现在,要将这些化学物质逐个倒入同一个试管之中,具体倒入顺序不限。
我们需要计算一下试管的危险值。
已知,空试管的危险值为 1,每倒入一种化学物质,如果该物质能够与之前倒入试管中的一种或多种物质发生反应,则试管的危险值将乘以 2。
请你计算并输出,通过合理安排所有化学物质的倒入顺序,能够得到的试管的最大危险值。
输入格式
第一行包含两个整数 n,m。
接下来 m 行,每行包含两个整数 x,y,表示化学物质 x 和化学物质 y 之间会发生反应。保证同一对化学物质在输入中最多出现一次。
输出格式
一个整数,表示最大危险值。
数据范围
前 4 个测试点满足 \(1≤n≤10。\)
所有测试点满足 $ 1≤n≤50,0≤m≤n(n−1)2,1≤x<y≤n。$
输入样例1:
1 0
输出样例1:
1
输入样例2:
2 1
1 2
输出样例2:
2
输入样例3:
3 2
1 2
2 3
输出样例3:
4
题意中几个很重要的性质抓出来
- 第一个放入的物品无法和其他物质反映,因为此时试管中没有其他物品
- 不能相互反应的物品一定严格独立,没有交集
- 假设同一个反应体系中的物品数为k个,则该反应体系对危险程度的贡献度为\(2^{k-1}\),因此我们可以看出,每一个反应体系实际就是一个连通块,即每一个连通块中的物品数量为\(k_i\),则该连通块的作用即可为\(2^{k_i}-1\)
现在共有t个独立的连通块,则总的贡献度为\(2^{k_1}-1\) * \(2^{k_2}-1\) * ... * \(2^{k_i}-1\) = \(2^{k_1+k_2+...+k_i-t}\)
我们注意到共有n件物品,因此结果为\(2^{n-t}\),题目瞬间转化为求解独立的连通块的数量
1. 法一:并查集求解独立连通块数量
#include <bits/stdc++.h>
using namespace std;
const int N = 55;
int p[N];
int n,m;
typedef long long LL;
int find(int x)
{
if (p[x]!=x) p[x]=find(p[x]);
return p[x];
}
int main()
{
cin>>n>>m;
for (int i=1;i<=n;i++) p[i]=i;
int cnt=n; // cnt为独立集合的数量,即连通块的数量
while (m--)
{
int a,b;
cin>>a>>b;
int pa = find(a);
int pb = find(b);
if (pa!=pb)
{
cnt--;
p[pa]=pb;
}
}
printf("%lld\n",1ll<<n-cnt);
return 0;
}
2. 建图,图的遍历求解连通块的数量
dfs写法一
#include <bits/stdc++.h>
using namespace std;
const int N = 55;
bool st[N],reaction[N][N];
int n,m;
typedef long long LL;
LL ans=1;
void dfs(int x)
{
for (int i=1;i<=n;i++)
{
if (reaction[x][i]&&!st[i]) // 当前物品与1~i(除本身)有反应,即更新ans并顺着这个物品遍历
{
ans<<=1;
st[i]=true;
dfs(i);
}
}
}
int main()
{
cin>>n>>m;
while (m--)
{
int a,b;
cin>>a>>b;
reaction[a][b]=reaction[b][a]=true;
}
for (int i=1;i<=n;i++)
{
if (!st[i]) // 只要当前的物品还没有用过
{
st[i]=true;
dfs(i);
}
}
cout<<ans<<endl;
return 0;
}
dfs写法二
#include <bits/stdc++.h>
using namespace std;
const int N = 55 ,M = N*N; // 无向图注意边数
int e[M],h[N],ne[M],idx;
int n,m;
typedef long long LL;
bool st[N];
void add(int a,int b) // 经典邻接表建图add
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int x) // dfs遍历无向图
{
st[x]=true;
for (int i=h[x];~i;i=ne[i])
{
int j = e[i];
if (!st[j]) dfs(j);
}
}
int main()
{
cin>>n>>m;
memset(h,-1,sizeof h); // 不初始化的后果就是TLE
while (m--)
{
int a,b;
cin>>a>>b;
add(a,b),add(b,a); // 无向图即为特殊的有向图
}
int cnt=0; // 求解连通块的数量
for (int i=1;i<=n;i++)
{
if (!st[i])
{
dfs(i);
cnt++;
}
}
cout<<(1ll<<n-cnt)<<endl; // 答案为2^{n-cnt}
return 0;
}
bfs写法
#include <bits/stdc++.h>
using namespace std;
const int N = 55 ,M = N*N; // 无向图注意边数
int e[M],h[N],ne[M],idx;
int n,m;
typedef long long LL;
bool st[N];
queue<int>q;
void add(int a,int b) // 经典邻接表建图add
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void bfs(int x) // bfs遍历无向图
{
st[x]=true;
q.push(x); // 借助stl
while (q.size())
{
auto t = q.front();
q.pop();
for (int i=h[t];~i;i=ne[i])
{
int j = e[i];
if (!st[j])
{
st[j]=true;
q.push(j);
}
}
}
}
int main()
{
cin>>n>>m;
memset(h,-1,sizeof h); // 不初始化的后果就是TLE
while (m--)
{
int a,b;
cin>>a>>b;
add(a,b),add(b,a); // 无向图即为特殊的有向图
}
int cnt=0; // 求解连通块的数量
for (int i=1;i<=n;i++)
{
if (!st[i])
{
bfs(i);
cnt++;
}
}
cout<<(1ll<<n-cnt)<<endl; // 答案为2^{n-cnt}
return 0;
}
总结
不论是并查集写法,还是dfs和bfs写法,本质都是求解图中的连通子块个数。
因此,我们对求解连通块个数的题型,即可采用并查集和图的遍历这两大类方法,其中图的遍历可以用dfs(代码简洁)或者bfs(思路简单,但借助队列实现代码量较为冗长)
这次确实不难,还是fw,继续努力吧~
AcWing第85场周赛的更多相关文章
- AcWing 第11场周赛题解
计算abc 首先 \(0<=a<=b<=c\) 会随机给出 \(a+b,a+c,b+c,a+b+c\)的值 因为\(a,b,c\)都为正整数,所以\(a+b+c\)一定为最大值 然后 ...
- LeetCode-第 166 场周赛
LeetCode-第 166 场周赛 1281.subtract-the-product-and-sum-of-digits-of-an-integer 1282.group-the-people-g ...
- LeetCode 第 165 场周赛
LeetCode 第 165 场周赛 5275. 找出井字棋的获胜者 5276. 不浪费原料的汉堡制作方案 5277. 统计全为 1 的正方形子矩阵 5278. 分割回文串 III C 暴力做的,只能 ...
- LeetCode--第180场周赛
LeetCode--第180场周赛 1380. 矩阵中的幸运数 class Solution { public: vector<int> luckyNumbers (vector<v ...
- Leetcode第 217 场周赛(思维量比较大)
Leetcode第 217 场周赛 比赛链接:点这里 做完前两题我就知道今天的竞赛我已经结束了 这场比赛思维量还是比较大的. 1673. 找出最具竞争力的子序列 题目 给你一个整数数组 nums 和一 ...
- 【AcWing】第 62 场周赛 【2022.07.30】
AcWing 4500. 三个元素 题目描述 给定一个长度为 \(n\) 的数组 \(r\_1,r\_2,-,r\_n\). 请你找到其中的三个元素 \(r\_a,r\_b,r\_c\),使得 \(r ...
- Leetcode 第133场周赛解题报告
今天参加了leetcode的周赛,算法比赛,要求速度比较快.有思路就立马启动,不会纠结是否有更好的方法或代码可读性.只要在算法复杂度数量级内,基本上是怎么实现快速就怎么来了. 比赛时先看的第二题,一看 ...
- 第二场周赛(递归递推个人Rank赛)——题解
很高兴给大家出题,本次难度低于上一场,新生的六个题都可以直接裸递归式或者裸递推式解决,对于老生的汉诺塔3,需要找出一般式,后两题分别为裸ST算法(或线段树)/线性DP. 正确的难度顺序为 种花 角谷定 ...
- LeetCode第151场周赛(Java)
这是我第一次写周赛的题目,而且还是虚拟的.从这次起,以后就将所有错过的题目都写到博客来.当然既然是我错的,那代码肯定不是我自己的.我会注明来源.并且我会自己敲一遍.多总结总是没坏处的. 另外比较糟糕的 ...
- LeetCode第152场周赛(Java)
这算是我第一次正式参加 LeetCode 的周赛吧.通过两道题.意料之中(通过上次模拟可以看出来).总的来说,脑袋还是不太灵光.想的有点慢.全球第一名 0:10:19 就全部通过...感觉我的智商被狠 ...
随机推荐
- CentOS 7 安全基线检查
注意:操作时建议做好记录或备份 1.设置密码失效时间 | 身份鉴别 描述: 设置密码失效时间,强制定期修改密码,减少密码被泄漏和猜测风险,使用非密码登陆方式(如密钥对)请忽略此项. 加固建议: 使用非 ...
- iptables基本使用举例
一.链的基本操作 1.清除所有的规则. 1)清除预设表filter中所有规则链中的规则. # iptables -F 2)清除预设表filter中使用者自定链中的规则. #iptables -X #i ...
- 一篇文章带你了解网页框架——Vue简单入门
一篇文章带你了解网页框架--Vue简单入门 这篇文章将会介绍我们前端入门级别的框架--Vue的简单使用 如果你以后想从事后端程序员,又想要稍微了解前端框架知识,那么这篇文章或许可以给你带来帮助 温馨提 ...
- springboot+thymeleaf中前台页面展示中、将不同的数字替换成不同的字符串。使用条件运算符
主要用到的知识就是thyme leaf中的条件运算符 表达式:(condition)?:then:else 当条件condition成立时返回then.否则返回else 具体代码:<td th: ...
- JWT基础概念详解
JWT基础概念详解 JWT介绍 之前我们文章讲过分布式session如何存储,其中就讲到过Token.JWT.首先,我们来回顾一下使用Token进行身份认证. 客户端发送登录请求到服务器 服务器在用户 ...
- DevOps | 如何快速提升团队软件开发成熟度,快速提升研发效能?
今天一个小伙伴问我,如何「快速提升」一个团队的软件开发成熟度?我犯难了.我个人理解一个团队的软件开发成熟度涉及的东西很多,但最简单最直接的方法就是发钱涨工资,可是估计很多公司不愿意,那就只有扣了. 快 ...
- jQuery $.fn.extend()方法类插件
一.为JQuery原型扩展新的属性和方法,然后在JQuery的实例对象上调用 在 jQuery 中,我们可以使用$.fn.extend()方法来定义一个方法类插件.方法类插件就是首先你使用 jQuer ...
- 【lwip】08-ARP协议一图笔记及源码实现
目录 前言 8.1 IP地址与MAC地址 8.2 ARP协议简介 8.3 ARP协议报文 8.4 ARP缓存表 8.4.1 ARP缓存表简介 8.4.2 LWIP中的缓存表 8.4.3 ARP缓存表数 ...
- ubuntu 安装anaconda3
ubuntu 安装anaconda3 官网:https://www.anaconda.com/ 下载:https://www.anaconda.com/products/individual#Down ...
- JS 学习笔记 (六) 函数式编程
1.函数闭包 1.1 概述 JavaScript采用词法作用域,函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的. 为了实现这种词法作用域,JavaScript函数对 ...