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

AtCoder AT_abc412_c [ABC412C] Giant Domino 题解

题目大意

N N N 个数,顺序可以打乱,第 i i i 个数是 S i S_i Si。每次可以从第 i i i 个数跳到第 j j j 个数当且仅当满足 S j ≤ 2 ⋅ S i S_j\le 2\cdot S_i Sj2Si,问从第 1 1 1 个数跳到第 N N N 个数最少需要多少步。

思路

容易发现,每次跳到的数越大越好,这样答案才能最优。因为如果你跳到第 x x x 个数后下一步可以跳到第 k k k 个数,同时也可以跳到第 y y y 个数且满足 S x ≤ S y S_x\le S_y SxSy,那么跳到第 y y y 个数后一定也可以跳到第 k k k 个数,所以显然是不劣的。对于满足 S x < S y S_x<S_y Sx<Sy 的情况,如果存在 S z = 2 ⋅ S y S_z=2\cdot S_y Sz=2Sy,那么第 y y y 个数可以跳过去而第 x x x 个数不可以。所以,我们优先跳到值更大的数。

由于可以打乱顺序,我们为了方便可以直接对这个数组进行从小到大排序,然后找到其中 S 1 S_1 S1 S N S_N SN 的位置,分别记为 l l l r r r。如果某个数出现了多次也不影响计算答案,因为同一个值反复跳显然是不优的。如果满足 S 1 ≥ S N S_1\ge S_N S1SN 的话,可以直接输出 2 并不再进行下列操作,否则会有十二个点答案错误。

数组具有单调性,我们从 l l l 开始跳,每次用二分跳满足 S p ≤ 2 ⋅ S l S_p\le 2\cdot S_l Sp2Sl S p S_p Sp 尽可能大的 p p p,然后将 l l l 的值设为 p p p,统计数量,直到 S l S_l Sl S r S_r Sr 相等为止。如果在过程中出现死循环(及 S p S_p Sp S l S_l Sl 相等),则无解(输出 -1 并结束操作)。

代码

提交记录:Submission #67141171。

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;int t, n, s[200010];int main()
{cin >> t;while (t--){cin >> n;for (int i = 1; i <= n; i++)cin >> s[i];int sz1 = s[1], sz2 = s[n];sort(s + 1, s + n + 1);int l = upper_bound(s + 1, s + n + 1, sz1) - s - 1;int r = upper_bound(s + 1, s + n + 1, sz2) - s - 1;if (sz1 * 2 >= sz2){cout << "2" << endl;continue;}int ans = 1;while (l != r && s[l] != s[r]){int p = upper_bound(s + l, s + r + 1, 2 * s[l]) - s - 1;if (p <= l || s[l + 1] > 2 * s[l]){ans = -1;break;}l = p;ans++;}cout << ans << endl;}return 0;
}

文章转载自:
http://aristocrat.elldm.cn
http://abominably.elldm.cn
http://archdeacon.elldm.cn
http://camomile.elldm.cn
http://aphthongal.elldm.cn
http://africanization.elldm.cn
http://appoggiatura.elldm.cn
http://azul.elldm.cn
http://boarish.elldm.cn
http://centuried.elldm.cn
http://breeziness.elldm.cn
http://antilitter.elldm.cn
http://bristletail.elldm.cn
http://buffo.elldm.cn
http://animosity.elldm.cn
http://brainfag.elldm.cn
http://boogiewoogie.elldm.cn
http://anticonvulsant.elldm.cn
http://afroism.elldm.cn
http://c.elldm.cn
http://brucellergen.elldm.cn
http://casein.elldm.cn
http://byzantinesque.elldm.cn
http://aline.elldm.cn
http://albert.elldm.cn
http://acrimonious.elldm.cn
http://amusing.elldm.cn
http://adjure.elldm.cn
http://alumnae.elldm.cn
http://banana.elldm.cn
http://www.dtcms.com/a/261727.html

相关文章:

  • 【力扣 简单 C】121. 买卖股票的最佳时机
  • GitHub Actions 实现 AWS ECS 服务的多集群安全重启方案
  • 【AI实践】Mac一天熟悉AI模型智能体应用(百炼版)
  • STM32中Usart的使用
  • 一个简单测试Deepseek吞吐量的脚本,国内环境可跑
  • 1.1 基于Icarus Verilog、ModelSim和Vivado对蜂鸟E203处理器进行仿真
  • HarmonyOS File和base64字符串转换
  • Note2.2 机器学习训练技巧:Batch and Momentum(Machine Learning by Hung-yi Lee)
  • C语言二级指针与多级指针
  • cannot import name ‘TextKwargs‘ from ‘transformers.processing_utils‘
  • 【LeetCode 热题 100】438. 找到字符串中所有字母异位词——(解法二)定长滑动窗口+数组
  • LeetCode Hot 100 找到字符串中所有字母异位词
  • 编译流程详解
  • 利用ROS打印novatel_msgs/INSPVAX
  • 滑坡监测接收机市场分析
  • libxlsxwriter: 一个轻量级的跨平台的C++操作Excel的开源库
  • 个人日记本小程序开发方案(使用IntelliJ IDEA)
  • python解释器 与 pip脚本常遇到的问题汇总
  • 【stm32】HAL库开发——CubeMX配置ADC
  • Minio入门+适配器模式(实战教程)
  • ZooKeeper深度面试指南三
  • uni-app subPackages 分包加载:优化应用性能的利器
  • uniapp上拉加载和下拉刷新组件mescroll-uni
  • 如何利用好doctor
  • JavaScript---字符串篇
  • 我的世界模组开发进阶教程——机械动力的数据生成(2)
  • ZooKeeper深度面试指南二
  • 【数据标注师】3D标注
  • WordPress最新版6.8.1安装教程
  • 解决cursor无法下载插件等网络问题