当前位置: 首页 > news >正文

P6120 [USACO17JAN] Hoof, Paper, Scissor S

难度:普及/提高−;

题意

​ 石头、剪刀、布游戏,先给出 n n n 轮已经知道的其中一人的对局情况,例如样例:

5
P - 布
P - 布
H - 石头
P - 布
S - 剪刀

另外一人,只允许修改一次机会的情况下,求最多可以赢的局面数量。

分析

​ 题意理解了,我感觉就是很简单,可以用双指针做,也可以用前缀和分开两段来做。这里讲述前缀和分两段的分别统计贡献的方式来做。

​ 根据题意可知,手势一旦确定为 x x x,那么只允许在后面第 k k k 次发生了修改为 y y y,那么贡献(胜利的局数)就是 k [ x ] 1 ∼ x + k [ y ] x ∼ n k[x]_{1 \sim x} \ + \ k[y]_{x \sim n} k[x]1x + k[y]xn,其中 k k k 数组可以用前缀和来完成。

参考代码:

#include <bits/stdc++.h>
#define ll long longconst int N = 100050;
int h[N], s[N], p[N], n;int mx(int a, int b) // 为了让代码看起来简短一些
{if (a > b)return a;return b;
}int main()
{std::ios::sync_with_stdio(false), std::cin.tie(nullptr);std::cin >> n;for (int i = 1; i <= n; i++){h[i] = h[i - 1], s[i] = s[i - 1], p[i] = p[i - 1];char ch;std::cin >> ch;if (ch == 'H')h[i]++;if (ch == 'S')s[i]++;if (ch == 'P')p[i]++;}int ans = 0;for (int i = 1; i <= n; i++) // [1-i], [i+1,n] 找出区间内最长的两段ans = mx(ans, mx(h[i], mx(s[i], p[i])) + mx(h[n] - h[i], mx(s[n] - s[i], p[n] - p[i])));std::cout << ans << '\n';return 0;
}
http://www.lryc.cn/news/527888.html

相关文章:

  • Android Studio打包APK
  • 08 比特币通用技术介绍
  • 拟合损失函数
  • 二进制安卓清单 binary AndroidManifest - XCTF apk 逆向-2
  • 在线免费快速无痕去除照片海报中的文字logo
  • 引领未来科技潮流:Web3 前沿发展趋势
  • 【番外篇】鸿蒙扫雷天纪:运混沌灵智勘破雷劫天局
  • 08.OSPF 特殊区域及其他特性
  • 人工智能在医疗领域的应用有哪些?
  • c#使用Confluent.Kafka实现生产者发送消息至kafka(远程连接kafka发送消息超时的解决 Local:Message timed out)
  • 【2025年数学建模美赛F题】(顶刊论文绘图)模型代码+论文
  • DeepSeek 的背景介绍
  • Meta 计划 2025 年投资 650 亿美元推动 AI 发展
  • 信息学奥赛一本通 2110:【例5.1】素数环
  • Redis、MongoDB 和 MySQL评估
  • P1719 最大加权矩形
  • 在生产环境中部署和管理 Apache:运维从入门到精通
  • DeepSeek API 的获取与对话示例
  • 【愚公系列】《循序渐进Vue.js 3.x前端开发实践》027-组件的高级配置和嵌套
  • 预测性维护系统:让设备“未卜先知”
  • Qt Ribbon使用实例
  • Midscene.js:重新定义UI自动化的新时代工具
  • 【C语言基础】编译并运行第一个C程序
  • 处理 .gitignore 未忽略文件夹问题
  • php-phar打包避坑指南2025
  • 卡特兰数学习
  • 第05章 10 地形梯度场模拟显示
  • 2023CISCN初赛unzip
  • 计算机网络 (55)流失存储音频/视频
  • Linux通过docker部署京东矩阵容器服务