这场周赛是手速局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:

  1. 2
  2. 1 5 5
  3. 2 6 4

输出样例1:

  1. LIVE
  2. LIVE

输入样例2:

  1. 3
  2. 1 0 10
  3. 2 0 10
  4. 1 10 0

输出样例2:

  1. LIVE
  2. DEAD

简单的枚举即可,借助哈希表记录无罪票数和有罪票数

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int a[3],b[3];
  4. int n;
  5. int main()
  6. {
  7. cin>>n;
  8. while (n--)
  9. {
  10. int t,x,y;
  11. cin>>t>>x>>y;
  12. a[t]+=x;
  13. b[t]+=y;
  14. }
  15. for (int i=1;i<=2;i++)
  16. if (a[i]>=b[i])
  17. puts("LIVE");
  18. else puts("DEAD");
  19. return 0;
  20. }

最大价值

已知,小写字母 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]。

输入样例:

  1. abc
  2. 3
  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

输出样例:

  1. 41

贪心即可,经过证明(很好证)要得到最大价值,插入方法即在尾部插入k个单个价值的最大的字母

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 1010;
  4. string s;
  5. int w[N];
  6. int k;
  7. typedef long long LL;
  8. int main()
  9. {
  10. cin>>s>>k;
  11. int res=0;
  12. for (int i=0;i<26;i++)
  13. cin>>w[i],res=max(res,w[i]);
  14. LL ans=0;
  15. for (int i=0;i<s.size();i++)
  16. ans+=(w[s[i]-'a']*(i+1)); // 这里一定要记着-'a'啊!血的教训,这细节要注意!
  17. int len=s.size();
  18. for (int i=len+1;i<=k+len;i++)
  19. {
  20. ans+=res*i;
  21. }
  22. cout<<ans<<endl;
  23. return 0;
  24. }

危险程度

有 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. 1 0

输出样例1:

  1. 1

输入样例2:

  1. 2 1
  2. 1 2

输出样例2:

  1. 2

输入样例3:

  1. 3 2
  2. 1 2
  3. 2 3

输出样例3:

  1. 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. 法一:并查集求解独立连通块数量

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 55;
  4. int p[N];
  5. int n,m;
  6. typedef long long LL;
  7. int find(int x)
  8. {
  9. if (p[x]!=x) p[x]=find(p[x]);
  10. return p[x];
  11. }
  12. int main()
  13. {
  14. cin>>n>>m;
  15. for (int i=1;i<=n;i++) p[i]=i;
  16. int cnt=n; // cnt为独立集合的数量,即连通块的数量
  17. while (m--)
  18. {
  19. int a,b;
  20. cin>>a>>b;
  21. int pa = find(a);
  22. int pb = find(b);
  23. if (pa!=pb)
  24. {
  25. cnt--;
  26. p[pa]=pb;
  27. }
  28. }
  29. printf("%lld\n",1ll<<n-cnt);
  30. return 0;
  31. }

2. 建图,图的遍历求解连通块的数量

dfs写法一

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 55;
  4. bool st[N],reaction[N][N];
  5. int n,m;
  6. typedef long long LL;
  7. LL ans=1;
  8. void dfs(int x)
  9. {
  10. for (int i=1;i<=n;i++)
  11. {
  12. if (reaction[x][i]&&!st[i]) // 当前物品与1~i(除本身)有反应,即更新ans并顺着这个物品遍历
  13. {
  14. ans<<=1;
  15. st[i]=true;
  16. dfs(i);
  17. }
  18. }
  19. }
  20. int main()
  21. {
  22. cin>>n>>m;
  23. while (m--)
  24. {
  25. int a,b;
  26. cin>>a>>b;
  27. reaction[a][b]=reaction[b][a]=true;
  28. }
  29. for (int i=1;i<=n;i++)
  30. {
  31. if (!st[i]) // 只要当前的物品还没有用过
  32. {
  33. st[i]=true;
  34. dfs(i);
  35. }
  36. }
  37. cout<<ans<<endl;
  38. return 0;
  39. }

dfs写法二

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 55 ,M = N*N; // 无向图注意边数
  4. int e[M],h[N],ne[M],idx;
  5. int n,m;
  6. typedef long long LL;
  7. bool st[N];
  8. void add(int a,int b) // 经典邻接表建图add
  9. {
  10. e[idx]=b,ne[idx]=h[a],h[a]=idx++;
  11. }
  12. void dfs(int x) // dfs遍历无向图
  13. {
  14. st[x]=true;
  15. for (int i=h[x];~i;i=ne[i])
  16. {
  17. int j = e[i];
  18. if (!st[j]) dfs(j);
  19. }
  20. }
  21. int main()
  22. {
  23. cin>>n>>m;
  24. memset(h,-1,sizeof h); // 不初始化的后果就是TLE
  25. while (m--)
  26. {
  27. int a,b;
  28. cin>>a>>b;
  29. add(a,b),add(b,a); // 无向图即为特殊的有向图
  30. }
  31. int cnt=0; // 求解连通块的数量
  32. for (int i=1;i<=n;i++)
  33. {
  34. if (!st[i])
  35. {
  36. dfs(i);
  37. cnt++;
  38. }
  39. }
  40. cout<<(1ll<<n-cnt)<<endl; // 答案为2^{n-cnt}
  41. return 0;
  42. }

bfs写法

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 55 ,M = N*N; // 无向图注意边数
  4. int e[M],h[N],ne[M],idx;
  5. int n,m;
  6. typedef long long LL;
  7. bool st[N];
  8. queue<int>q;
  9. void add(int a,int b) // 经典邻接表建图add
  10. {
  11. e[idx]=b,ne[idx]=h[a],h[a]=idx++;
  12. }
  13. void bfs(int x) // bfs遍历无向图
  14. {
  15. st[x]=true;
  16. q.push(x); // 借助stl
  17. while (q.size())
  18. {
  19. auto t = q.front();
  20. q.pop();
  21. for (int i=h[t];~i;i=ne[i])
  22. {
  23. int j = e[i];
  24. if (!st[j])
  25. {
  26. st[j]=true;
  27. q.push(j);
  28. }
  29. }
  30. }
  31. }
  32. int main()
  33. {
  34. cin>>n>>m;
  35. memset(h,-1,sizeof h); // 不初始化的后果就是TLE
  36. while (m--)
  37. {
  38. int a,b;
  39. cin>>a>>b;
  40. add(a,b),add(b,a); // 无向图即为特殊的有向图
  41. }
  42. int cnt=0; // 求解连通块的数量
  43. for (int i=1;i<=n;i++)
  44. {
  45. if (!st[i])
  46. {
  47. bfs(i);
  48. cnt++;
  49. }
  50. }
  51. cout<<(1ll<<n-cnt)<<endl; // 答案为2^{n-cnt}
  52. return 0;
  53. }

总结

不论是并查集写法,还是dfs和bfs写法,本质都是求解图中的连通子块个数。

因此,我们对求解连通块个数的题型,即可采用并查集和图的遍历这两大类方法,其中图的遍历可以用dfs(代码简洁)或者bfs(思路简单,但借助队列实现代码量较为冗长)


这次确实不难,还是fw,继续努力吧~

AcWing第85场周赛的更多相关文章

  1. AcWing 第11场周赛题解

    计算abc 首先 \(0<=a<=b<=c\) 会随机给出 \(a+b,a+c,b+c,a+b+c\)的值 因为\(a,b,c\)都为正整数,所以\(a+b+c\)一定为最大值 然后 ...

  2. LeetCode-第 166 场周赛

    LeetCode-第 166 场周赛 1281.subtract-the-product-and-sum-of-digits-of-an-integer 1282.group-the-people-g ...

  3. LeetCode 第 165 场周赛

    LeetCode 第 165 场周赛 5275. 找出井字棋的获胜者 5276. 不浪费原料的汉堡制作方案 5277. 统计全为 1 的正方形子矩阵 5278. 分割回文串 III C 暴力做的,只能 ...

  4. LeetCode--第180场周赛

    LeetCode--第180场周赛 1380. 矩阵中的幸运数 class Solution { public: vector<int> luckyNumbers (vector<v ...

  5. Leetcode第 217 场周赛(思维量比较大)

    Leetcode第 217 场周赛 比赛链接:点这里 做完前两题我就知道今天的竞赛我已经结束了 这场比赛思维量还是比较大的. 1673. 找出最具竞争力的子序列 题目 给你一个整数数组 nums 和一 ...

  6. 【AcWing】第 62 场周赛 【2022.07.30】

    AcWing 4500. 三个元素 题目描述 给定一个长度为 \(n\) 的数组 \(r\_1,r\_2,-,r\_n\). 请你找到其中的三个元素 \(r\_a,r\_b,r\_c\),使得 \(r ...

  7. Leetcode 第133场周赛解题报告

    今天参加了leetcode的周赛,算法比赛,要求速度比较快.有思路就立马启动,不会纠结是否有更好的方法或代码可读性.只要在算法复杂度数量级内,基本上是怎么实现快速就怎么来了. 比赛时先看的第二题,一看 ...

  8. 第二场周赛(递归递推个人Rank赛)——题解

    很高兴给大家出题,本次难度低于上一场,新生的六个题都可以直接裸递归式或者裸递推式解决,对于老生的汉诺塔3,需要找出一般式,后两题分别为裸ST算法(或线段树)/线性DP. 正确的难度顺序为 种花 角谷定 ...

  9. LeetCode第151场周赛(Java)

    这是我第一次写周赛的题目,而且还是虚拟的.从这次起,以后就将所有错过的题目都写到博客来.当然既然是我错的,那代码肯定不是我自己的.我会注明来源.并且我会自己敲一遍.多总结总是没坏处的. 另外比较糟糕的 ...

  10. LeetCode第152场周赛(Java)

    这算是我第一次正式参加 LeetCode 的周赛吧.通过两道题.意料之中(通过上次模拟可以看出来).总的来说,脑袋还是不太灵光.想的有点慢.全球第一名 0:10:19 就全部通过...感觉我的智商被狠 ...

随机推荐

  1. Kafka之 API实战

    Kafka之 API实战 一.环境准备 1)启动zk和kafka集群,在kafka集群中打开一个消费者 [hadoop1 kafka]$ bin/kafka-console-consumer.sh \ ...

  2. uoj349【WC2018】即时战略

    题目链接 WC出了点意外滚粗了,来补补题. \(O(n^2)\)的时间复杂度,\(O(nlogn)\)的询问次数应该还是比较好想的,每次要打通到x的路径,对当前已知的树不断的找重心并询问在重心的哪颗子 ...

  3. day01-4-订座功能

    满汉楼01-4 4.功能实现03 4.5订座功能 4.5.1功能说明 如果该餐桌处于已经预定或者就餐状态时,不能进行预定,并给出相应提示 4.5.2思路分析 根据显示界面,要考虑以下两种状态 检测餐桌 ...

  4. 关于.Net 7.0 RC gRPC JSON 转码为 Swagger/OpenAPI文档的注意事项

    大家好,我是失业在家,正在找工作的博主Jerry,找工作之余,看到.Net 7.0 RC2发布了,就想测试下.Net 7.0 RC2 gRPC JSON 转码为 Swagger/OpenAPI文档的特 ...

  5. C/S、B/S、Web的介绍(Web应用开发)

    文章目录 1.C/S结构介绍 2.B/S结构介绍 3.Web介绍 3.1 .什么是web? 3.2 .Web的工作原理 3.3 客户端应用技术 3.4 服务端应用技术 1.C/S结构介绍 Client ...

  6. Vue学习之--------el与data的两种写法、MVVM模型、数据代理(2022/7/5)

    文章目录 1.el与data的两种写法 1.1.基础知识 1.2.代码实例 1.3.页面效果 2.MVVM模型 2.1. 基础知识 2.2 .代码实例 2.3.页面效果 3.数据代理 3.1. 基础知 ...

  7. C++ Undefined Behavior 详细列表

    Undefined Behavior,即未定义的行为,指程序不可预测的执行效果,一般由错误的代码实现引起.出于效率.兼容性等多方面原因,语言标准不便于定义错误程序的明确行为,而是将其统称为" ...

  8. 第三方库openPyxl读取excel文件

    import openpyxl from openpyxl.worksheet.worksheet import Worksheet def openpyxl_read(): #1.打开文件 work ...

  9. 教你如何解决T+0的问题

    摘要:T+0查询是指实时数据查询,数据查询统计时将涉及到最新产生的数据. 本文分享自华为云社区<大数据解决方案:解决T+0问题>,作者: 小虚竹 . T+0问题 T+0查询是指实时数据查询 ...

  10. .net core 配置跨域

    使用场景: 由于浏览器的同源策略,即浏览器的安全功能,同源策略会阻止一个域的js脚本和另一个域的内容进行交互. 会出现以下报错: 怎样属于非同源呢? 协议.域名.端口号只要有一个不相同就是属于非同源 ...