重现赛链接

这场比赛我补了A、C、G、M四道题。

A. Ban or Pick, What's the Trick

C. Catch You Catch Me

G. Let Them Eat Cake

M. Rock-Paper-Scissors Pyramid


A. Ban or Pick, What's the Trick

A题是一道比较需要考验思维的记忆化搜索题目,原题意思是a、b团队分别有n个英雄,每个英雄有自己的战斗力,每个阵营在自己的回合中可以有两种选择:

1、ban掉一个对方阵营中还没被选择的英雄;

2、选择一个己方阵营还没被ban的英雄。

k为每个阵营最多可以选择的英雄数量。

 Sa  为a阵营选择英雄后的总战斗力, Sb  则为b阵营选择英雄后的总战斗力,

求两个阵营在表现都最佳的情况下,Sa - Sb 的最终值。

思路:

记忆化搜索,在每次 dfs 的时候都选择当前阵营最优的选法。由于k<=10,所以我们数组可以开到三维,

即dp[1e5*2][10][10](*2是因为我们把每个阵营的回合都拆开来,这样在写dfs的时候好判断些)

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;const int N = 100010, M = 600010, mod = 998244353;
const long long INF = 1e18;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef long long LL;
typedef pair<LL, LL> PLL;LL n, m;
LL a[N], b[N], dp[N * 2][15][15];bool com(LL a, LL b) {return a > b;
}LL dfs(LL turn, LL cnta, LL cntb) {//两个阵营分别选了cnta、cntb个英雄if (turn == 2 * n)return 0;if (dp[turn][cnta][cntb] != -INF)return dp[turn][cnta][cntb];int ra = turn / 2 + cnta - cntb;//ra:a阵营被操作(ban或选)的英雄数(rb同理)int rb = (turn + 1) / 2 - cnta + cntb;//(turn+1)/2是b阵营最多被ban掉的英雄数量(turn/2则是a阵营的)if (turn % 2) {//b的回合LL res = INF;//b希望res的值最小化,所以是取minif (cntb < m && rb + ra <= 2 * n)res = min(res, dfs(turn + 1, cnta, cntb + 1) - b[rb + 1]);res = min(res, dfs(turn + 1, cnta, cntb));dp[turn][cnta][cntb] = res;return res;}else {//a的回合LL res = -INF;//a希望res的值最大化,所以是取maxif (cnta < m && ra + rb <= 2 * n)res = max(res, dfs(turn + 1, cnta + 1, cntb) + a[ra + 1]);res = max(res, dfs(turn + 1, cnta, cntb));dp[turn][cnta][cntb] = res;return res;}
}void init() {for (int i = 0; i <= 2 * n; i++)for (int j = 0; j <= m; j++)for (int k = 0; k <= m; k++)dp[i][j][k] = -INF;
}int main() {cin >> n >> m;init();for (int i = 1; i <= n; i++)cin >> a[i];for (int i = 1; i <= n; i++)cin >> b[i];sort(a + 1, a + 1 + n, com);sort(b + 1, b + 1 + n, com);cout << dfs(0, 0, 0) << endl;return 0;
}

C. Catch You Catch Me

大概题意为给你 n 条路径构成一个无向树,结点编号为1~n。在这棵树中,结点 1 为出口,其他所有结点上都有一只蝴蝶。每一分钟,每只蝴蝶都会沿着一条边向 1 号结点方向移动。

主人公Bobo能做的是选择树中某一分钟的任何结点(包括第0分钟,所有的蝴蝶都在它们各自的结点上),并捕获该结点上的所有蝴蝶(Bobo不能捕获结点1上的蝴蝶,因为蝴蝶到达结点1后立即消失)。

求Bobo抓到所有的蝴蝶最少要操作几次。

思路:

设置 ans 为Bobo的操作次数

1、在第0分钟的时候,Bobo需要将 结点1 的所有临接点上的蝴蝶抓到(不然它们就跑了),所以 ans+= 结点1的临接点的个数;

2、在每个 结点1 的子树中,我们完全可以等同一深度的蝴蝶走到一起时再抓,所以每棵子树需要的操作数为子树的深度,所以 ans += 所有子树的深度。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>using namespace std;
typedef long long LL;
typedef pair<LL,LL> PLL;
typedef pair<int,int> PII;
const int N=100010;LL n,m;
int h[N],e[N*2],ne[N*2],idx;void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}vector<int>v;
LL res=0;
void dfs(int u,int fa,LL d){<br>  //d 为深度res=max(res,d);for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(j==fa)continue;dfs(j,u,d+1);}
}int main(){memset(h,-1,sizeof h);cin>>n;LL ans=0;for(int i=1;i<n;i++){int a,b;cin>>a>>b;if(a>b)swap(a,b);add(a,b);add(b,a);if(a==1){v.push_back(b);}}for(int i=0;i<v.size();i++){res=0;dfs(v[i],1,1);ans+=res;}cout<<ans<<endl;return 0;
}

G. Let Them Eat Cake

G题的题意大概是给你 n 个人,每个人有自己的号码,每个人都希望能得到Bobo王给的蛋糕。

在一轮中,有:

1、如果队伍剩余一个人,那么Bobo王会直接给他蛋糕(不计回合数);

2、如果一个人的号码比相邻的人(可能为1个 可能为2个)小,那么他就会得到蛋糕,然后退出队伍,后面的人按照顺序往前填补空缺(这算一轮)。

问:Bobo王想让所有人都得到蛋糕,最少需要多少轮?

思路:

一开始我想错了,以为是号码要同时比旁边的人小才能拿到蛋糕,结果wa了好几发.....

用两个vector来记录当前还在队伍中的人的号码,拿到蛋糕的人就离开,不会再进入下一轮。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>using namespace std;
typedef long long LL;
typedef pair<LL, LL> PLL;
typedef pair<int, int> PII;
const int N = 100010;LL n, m;
vector<LL>a, b;
int main() {cin >> n;for (int i = 0; i < n; i++) {LL x;cin >> x;b.push_back(x);}LL cnt = 0;while (true) {if (b.size() <= 1)break;for (int x : b)a.push_back(x);b.clear();for (int i = 0; i < a.size(); i++)if (!i && a[i] > a[i + 1])b.push_back(a[i]);else if (i == a.size() - 1 && a[i - 1] < a[i])b.push_back(a[i]);else if (a[i - 1]<a[i] && a[i]>a[i + 1])b.push_back(a[i]);a.clear();cnt++;}cout << cnt << endl;return 0;
}

M. Rock-Paper-Scissors Pyramid

R :石头           S :剪刀             P :布

Bobo设计了一个“石头剪刀布”金字塔,将初始字符串 s 按顺序放置在最下面的积木上,金字塔按以下规则演化:

如果紧挨着一个方块下方的两个方块具有相同的形状(即都是R、P或S),我们将在方块上放置相同的形状。

如果一个方块下面的两个方块形状不同,我们将把获胜的形状放在方块上。

每次给你一串字符串序列(由若干个‘S’ 、‘R’ 、‘P’ 组成),问你最后哪个形状会到达塔顶。

思路:

如果一个字母要赢到最后,那么它肯定是所有字母里赢得次数最多的。为什么呢?

假设我是布,我前面是石头,那么无论如何到最后一定会是我距离塔顶更近(我会比前面的石头高一层);

同理,如果我是剪刀,我后面是石头,那么最后我一定会送我后面的石头更上一层。

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 1000010, M = 600010;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef long long LL;
typedef pair<LL, LL> PLL;LL n, m;
char s[N];
bool check(char a, char b) {if (a == b)return false;if (a == 'S')return b == 'P';if (a == 'P')return b == 'R';if (a == 'R')return b == 'S';//返回a是不是赢了
}int main() {cin >> n;while (n--) {scanf("%s", s + 1);int ans = 0, maxc = -1;int pos = 1;int len = strlen(s + 1);for (int i = 2; i <= len; i++) {if (s[i] == s[i - 1])continue;if (check(s[i], s[i - 1]))ans++;else ans--;if (ans > maxc) {pos = i;maxc = ans;}}if (maxc == -1)pos = 1;printf("%c\n", s[pos]);}return 0;
}

官方题解

【CCPC】2022年绵阳站部分题解(ACGM)相关推荐

  1. 2020 CCPC 绵阳站 J-Joy of Handcraft (调和级数 线段树)

    2020 CCPC 绵阳站 J-Joy of Handcraft (调和级数 线段树) 之前一直对线段树有种恐惧感,感觉十分晦涩难懂,但是我还是得迎男而上!这题必须补!我说的!耶稣都留不住! 题目 h ...

  2. 2020CCPC绵阳站 Defuse the Bombs(简单二分)

    2020CCPC绵阳站 Defuse the Bombs(简单二分) 题目 https://pintia.cn/problem-sets/1322796904464203776/problems/13 ...

  3. 【超好懂的比赛题解】2020ICPC澳门站 个人题解

    title : 2021ICPC澳门站 个人题解 date : 2022-10-6 tags : ACM,题解,练习记录 author : Linno 2020ICPC澳门站 个人题解 题目链接:ht ...

  4. 2022新版谷歌站群/谷歌站群源码/谷歌站群系统

    2022新版谷歌站群/谷歌站群源码/谷歌站群系统 新版谷歌站群,刚出炉没多久,效果杠杠的,某些作者我就不说了,拿我的做二道贩子 源码效果显著: 1.系统采用静态缓冲的形式,亲和搜索引擎,无需数据库,无 ...

  5. 2022合肥新站高新区招聘社区工作者每日一练及答案

    题库来源:优题宝公众号 2022合肥新站高新区招聘社区工作者每日一练及答案,根据最新社区工作者大纲与历年真题汇总编写,包含社区工作者常考重点题型与知识点,有助于考生复习备考社区工作者,取得好成绩. 1 ...

  6. 蓝桥杯2022年B组初赛题解C++(待完善)

    文章目录 蓝桥杯2022年B组初赛题解C++ A题:九进制转十进制 B题:顺子日期 C题:刷题统计 D题:修剪灌木 E题:X进制减法 F题:统计子矩阵 G题:积木画 H题:扫雷 I题:李白打酒加酒加强 ...

  7. 盘点2022年度A站UE神作top

    A站大家都应该很熟悉了,在全球的CG行业都是属于专业化十分高的网站,平台内展示的内容包括影视.动画.娱乐等等板块,更是收录了众多大神艺术家的作品,多看看可以最直接的了解整个行业的审美趋势与技术动向. ...

  8. Visual Studio 2022版本 B站黑马程序员C++自学分享-第一阶段(主要包括:自己敲的代码、通过注释来备注上自己对代码的理解)

    Visual Studio 2022版本 B站黑马程序员C++自学分享-第一阶段(主要包括:自己敲的代码.通过注释来备注上自己对代码的理解) 前言 一.第一阶段 C++基础语法入门 对C++有初步了解 ...

  9. Visual Studio 2022版本 B站黑马程序员C++自学分享-第三阶段(1)(主要包括:自己敲的代码、通过注释来备注上自己对代码的理解)

    Visual Studio 2022版本 B站黑马程序员C++自学分享-第三阶段(1)(主要包括:自己敲的代码.通过注释来备注上自己对代码的理解) 前言 三.第三阶段 C++提高编程 介绍C++泛型编 ...

  10. 超140支爆款B站恰饭,2022年B站双11战报来了!

    - 导语 从0到3.06亿月活,从"与世无争"到今天手持高粘性.高活跃的用户参战双十一,在B站的品牌们有了更成熟的营销模式. 2022年双十一已经落下帷幕,在B站全面拥抱双十一的火 ...

最新文章

  1. java beetl 视频_08.Beetl自定义方法以及直接访问java类方法---《Beetl视频课程》
  2. 2018牛客网暑期ACM多校训练营第二场 D - money(贪心)
  3. C++——《数据结构与算法》实验——排序算法的实现
  4. 微软caffe-SSD的训练和预测(windows cpu)
  5. 如何使用Meter-WebSocketSampler
  6. java 定义xml_java中web.xml定义详解
  7. 风铃发卡网源码-可商用,支持个人码支付,当面付
  8. 不能在计算机网络上共享的打印机驱动程序,打印机已经共享,可是当别的电脑安装共享的打印机驱动程序时提示 windows 没法连接到打印机。拒绝访问??...
  9. oracle使用打开数据库,使用工具访问ORACLE数据库(一)
  10. obj模型 vue_uni-app npm 包手机端运行报错(vue-3d-model)
  11. php接收post原始数据
  12. UIImagePickerController的知识点总结
  13. mysql页面浏览记录表设计
  14. 谷歌翻译(英文PDF文档翻译成中文,免费无限制)
  15. 2020年新年新气象
  16. 网站性能优化--实例分析篇
  17. 腾讯云/阿里云域名注册解析备案
  18. 数据结构算法【考研】
  19. 判断深度学习的效果好坏loss和val_loss比较
  20. oracle查询员工表领导级别,emp表中怎么统计每个员工的领导的年薪,并按年薪由高到低排列...

热门文章

  1. 从零开始搭建一个前端框架(一)环境准备并完成简单打包
  2. Milvus以图搜图环境搭建
  3. “15分钟核酸检测服务圈”怎样进行采样点选址
  4. 回溯法实现求解子集合和问题
  5. Eli Bendersky's website » Code sample – socket client based on Twisted with PyQt
  6. php exec 命令,概述PHP命令行shell_exec()使用
  7. 竞品分析 | 百词斩竞品分析报告
  8. 导入Maven项目右下角蓝色小框消失解决办法
  9. numpy模块基础篇
  10. volatile原理:happen before