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

【基础完全搜索】USACO Bronze 2022 Open - 谎言的人数Counting Liars

题目描述

奶牛 Bessie 藏在数轴上的某个位置。农夫约翰的另外 NNN 头奶牛(1≤N≤10001 \le N \le 10001N1000)每一头都提供了一条信息:第 iii 头奶牛表示,Bessie 的位置要么小于等于 pip_ipi,要么大于等于 pip_ipi

但不幸的是,并不是所有奶牛都一定说了实话 —— 有可能没有任何一个位置能够同时满足所有奶牛的描述。

你的任务是:统计最少有多少头奶牛在说谎。

输入格式

第一行输入一个整数 NNN

接下来的 NNN 行,每行包含一个字符和一个整数,用空格分隔:字符是 LLLGGG

  • LLL 表示“Bessie 的位置小于等于 pip_ipi

  • GGG 表示“Bessie 的位置大于等于 pip_ipi

整数 pip_ipi 表示这头奶牛提供的位置信息,0≤pi≤1090 \le p_i \le 10^90pi109

输出格式

输出一个整数,表示最少有多少头奶牛在说谎。

样例输入 1

2
G 3
L 5

样例输出 1

0

样例输入 2

2
G 3
L 2

样例输出 2

1

说明/提示

样例解释 111:

Bessie 可能在 [3,5][3, 5][3,5] 之间的任何位置,两头奶牛都可能说了实话。

样例解释 222:

没有任何位置同时满足 x≥3x \ge 3x3x≤2x \le 2x2,因此至少有一头奶牛在说谎。

数据范围

  • 1≤N≤10001 \le N \le 10001N1000

  • 0≤pi≤1090 \le p_i \le 10^90pi109

提交链接

Counting Liars

思路分析

🧠 思路核心回顾

如果我们假设 Bessie 躲在位置 xxx,那么有两种撒谎的情况:

L pi,但 pi < x:意思是这个人说 Bessie ≤ pi,但 Bessie 比它大 → 撒谎

G pi,但 pi > x:这个人说 Bessie ≥ pi,但 Bessie 比它小 → 撒谎

于是我们可以:

把所有奶牛按 pi 排序,枚举所有的 pi 值(作为 Bessie 可能的位置),每次都数一下满足以上两类的奶牛有几个,加起来就是撒谎人数。

  1. 输入处理
    将每头奶牛的说法存储为 (位置 pi, 类型 G/L)。

  2. 排序
    将所有奶牛按位置从小到大排序。

  3. 撒谎规律分析

    • 如果一个奶牛说 L x,她认为 Bessie ≤ x;

      • 若 Bessie 实际位置 > x(即比她右边),她在撒谎;
      • 所以我们需要统计:在当前位置左边,说 L 的奶牛数量。
    • 如果一个奶牛说 G x,她认为 Bessie ≥ x;

      • 若 Bessie 实际位置 < x(即比她左边),她在撒谎;
      • 所以我们需要统计:在当前位置右边,说 G 的奶牛数量。
  4. 建立两个数组

    • lying_left[i]:Bessie 躲在第 i 个奶牛的位置时,左边有多少说 L 的奶牛在撒谎。
    • lying_right[i]:Bessie 躲在第 i 个奶牛的位置时,右边有多少说 G 的奶牛在撒谎。
  5. 遍历所有位置

    • 计算 lying_left[i] + lying_right[i],即 Bessie 躲在当前位置时的总撒谎数。

    • 最终答案为所有位置中撒谎数的最小值。

参考代码

#include <bits/stdc++.h>
using namespace std;int main()
{int n;cin >> n;vector<pair<int, char>> p(n);for (auto &[x, y] : p)cin >> y >> x; // G x(>=pi)     L x(<=pi)  两种情况sort(p.begin(), p.end());vector<int> lying_left(n) , lying_right(n);for (int i = 1; i < n; i++){lying_left[i] += lying_left[i - 1];if (p[i - 1].second == 'L')lying_left[i]++;}for(int i = n - 2; i >= 0; i--){lying_right[i] += lying_right[i + 1];if(p[i + 1].second == 'G')lying_right[i]++;}int mi = n;for(int i = 0; i < n; i++)mi = min(mi , lying_left[i] + lying_right[i]);cout << mi;return 0;
}
http://www.dtcms.com/a/300762.html

相关文章:

  • 元宇宙背景下治理模式:自治的乌托邦
  • JavaSE-String类
  • 【Ollama】大模型本地部署与 Java 项目调用指南
  • Wireshark TS | 发送数据超出接收窗口
  • C++核心编程学习-- 类和对象--继承
  • PROFINET转CAN通讯协议转换速通汽车制造
  • 简单题目之学校组织运动会
  • 【通识】线性代数(Linear Algebra)
  • 【C++】论如何封装红黑树模拟实现set和map
  • 【Java实例】服务器IP一站式管理
  • 新手向:IDM下载失败排查
  • 依赖倒置原则 Dependency Inversion Principle - DIP
  • MySQL 索引设计与查询性能优化实践指南
  • Chainlink Functions:为智能合约插上连接现实世界的翅膀
  • 【Redis】Redis 协议与连接
  • 使用低级上位画图法理解在对磁盘空间进行容量分配时【低级单位上位至高级单位的换算】
  • 系统集成项目管理工程师【第九章 项目管理概论】 - 项目管理过程组
  • Frontiers in Psychology投稿流程(一)
  • 【C语言网络编程】HTTP 客户端请求(基于 Socket 的完整实现)
  • k8s的csi对接GPFS
  • 结合Golang语言说明对多线程编程以及 select/epoll等网络模型的使用
  • PMO如何赋能AI产品项目治理和价值交付︱商汤绝影PMO总监陈福龙
  • rust-包和箱子
  • Gradle#Plugin
  • 【论文阅读】ON THE ROLE OF ATTENTION HEADS IN LARGE LANGUAGE MODEL SAFETY
  • Node.js特训专栏-配置与环境部署:20.PM2进程守护与负载均衡
  • Java面试实战:从基础到架构的全方位技术交锋
  • VUE2 学习笔记9 生命周期
  • 算法竞赛阶段二-数据结构(36)数据结构双向链表模拟实现
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘ipywidgets’问题