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

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 long

const 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.kler.cn/a/522975.html

相关文章:

  • 【机器学习】自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测
  • 【NLP251】NLP RNN 系列网络
  • NPM 使用介绍
  • 基于特征工程与转换方法的LightGBM资产预测研究
  • 【项目】基于Qt开发的音乐播放软件
  • Coze,Dify,FastGPT,对比
  • 重构字符串(767)
  • 【stm32学习】STM32F103相关特性
  • 抖音上线打车服务?抖音要大规模杀入网约车了吗?
  • Redis存储③Redis基本命令+内部编号和架构
  • SpringCloud系列教程:微服务的未来(十八)雪崩问题、服务保护方案、Sentinel快速入门
  • 接口技术-第3次作业
  • 供应链系统设计-供应链中台系统设计(九)- 商品中心设计篇
  • DBO优化最近邻分类预测matlab
  • c语言初级的复习
  • 2025牛客寒假算法营3
  • leetcode刷题-贪心03
  • 磁盘调度算法
  • 【PySide6快速入门】 QRadioButton单选按钮
  • 全程Kali linux---CTFshow misc入门
  • Python-基于PyQt5,json和playsound的通用闹钟
  • 汉语向编程指南
  • LeetCode:62.不同路径
  • 开发者交流平台项目部署到阿里云服务器教程
  • 【Redis】hash 类型的介绍和常用命令
  • 编解码技术:最大秩距离码(Maximum Rank Distance Code)