AcWing 蓝桥杯集训·每日一题2025·5439. 农夫约翰真的种地

server/2025/3/4 23:53:30/

5439. 农夫约翰真的种地

题目描述

农夫约翰在他的农场种植了 N N N 个芦笋,编号 ( 1 ∼ N ) (1 \sim N) (1N)
其中,第 i i i 个芦笋的初始高度为 h i h_i hi,每经过一天高度会增长 a i a_i ai
给定一个 ( 0 ∼ N − 1 ) (0 \sim N - 1) (0N1) 的排列 ( t 1 , t 2 , … , t N ) (t_1,t_2,\ldots,t_N) (t1,t2,,tN)
请问至少多少天后能够满足,对于每个 ( 1 ≤ i ≤ N ) (1 \leq i \leq N) (1iN),恰好有 t i t_i ti 个芦笋比第 i i i 个芦笋的高度更高。

输入格式

第一行包含整数 (T),表示共有 (T) 个测试数据。
每组数据:

  • 第一行包含整数 N N N
  • 第二行包含 N N N 个整数 ( h 1 , h 2 , … , h N ) (h_1,h_2,\ldots,h_N) (h1,h2,,hN)
  • 第三行包含 N N N 个整数 a 1 , a 2 , … , a N a_1,a_2,\ldots,a_N a1,a2,,aN
  • 第四行包含 N N N 个整数 t 1 , t 2 , … , t N t_1,t_2,\ldots,t_N t1,t2,,tN

输出格式

每组数据输出一行结果,一个整数表示答案,如果无解则输出 − 1 -1 1

数据范围

  • ( 1 ≤ T ≤ 10 ) (1 \leq T \leq 10) (1T10)
  • ( 1 ≤ N ≤ 2 × 1 0 5 ) (1 \leq N \leq 2 \times 10^5) (1N2×105)
  • ( 1 ≤ h i , a i ≤ 1 0 9 ) (1 \leq h_i,a_i \leq 10^9) (1hi,ai109)
  • ( 0 ≤ t i ≤ N − 1 ) (0 \leq t_i \leq N - 1) (0tiN1)
  • 保证 ( t 1 ∼ t N ) (t_1 \sim t_N) (t1tN) 是一个 ( 0 ∼ N − 1 ) (0 \sim N - 1) (0N1) 的排列
  • 一个测试点内所有的 ( N ) (N) (N) 相加之和不超过 $(2 \times 10^5) 。

解题思路

我们可以用一个结构体维护芦笋的最终高度排名(num),初始高度(st),每天增长高度(k)。
每个芦笋第 ( x ) (x) (x)天的高度对应一个式子 ( s t + k x ) (st + kx) (st+kx),将芦笋按高度排名排序,对于任意两个相邻芦笋(st1在前),需解一个不等式 ( s t 1 + k 1 x > s t 2 + k 2 x ) (st1 + k1x > st2 + k2x) (st1+k1x>st2+k2x),求出一个(x)的范围,所有(x)的范围取交集,无交集输出(-1),有交集再输出(x)的最小值。

对于不等式 ( s t 1 + k 1 x > s t 2 + k 2 x ) (st1 + k1x > st2 + k2x) (st1+k1x>st2+k2x),又可以分四种情况化简:
( k 1 ≠ k 2 ) (k1 \neq k2) (k1=k2) 时,有两种情况:
[ { x > s t 2 − s t 1 k 1 − k 2 ( k 1 − k 2 > 0 ) x < s t 2 − s t 1 k 1 − k 2 ( k 1 − k 2 < 0 ) ] [ \begin{cases} x > \frac{st2 - st1}{k1 - k2} & (k1 - k2 > 0) \\ x < \frac{st2 - st1}{k1 - k2} & (k1 - k2 < 0) \end{cases} ] [{x>k1k2st2st1x<k1k2st2st1(k1k2>0)(k1k2<0)]
当 (k1 = k2) 时,只用看 (st1) 与 (st2),如果 (st1 < st2),则必定无解;如果 (st1 > st2),则不等式恒成立。

所以主要处理当 ( k 1 ≠ k 2 ) (k1 \neq k2) (k1=k2) 时的两种情况,维护 (x) 的值域的上下限 ( [ m i n s , m a x s ] ) ([mins, maxs]) ([mins,maxs]) 即可,对于 ( k 1 − k 2 > 0 ) (k1 - k2 > 0) (k1k2>0) 的,更新 ( m i n s = max ⁡ ( m i n s , s t 2 − s t 1 k 1 − k 2 ) ) (mins = \max(mins, \frac{st2 - st1}{k1 - k2})) (mins=max(mins,k1k2st2st1)),否则更新 ( m a x s = min ⁡ ( m a x s , s t 2 − s t 1 k 1 − k 2 ) ) (maxs = \min(maxs, \frac{st2 - st1}{k1 - k2})) (maxs=min(maxs,k1k2st2st1))

还要注意取整方向,可以在求下限时下向取整,更新时加上(1);求上限时上向取整,更新时减(1),这样就可以得到一个闭区间,详见注释。

AC Code

// Problem: 农夫约翰真的种地
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/5442/
// Memory Limit: 64 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include<bits/stdc++.h>
typedef long long ll; // 确保 ll 在使用前被定义
using namespace std;
using i64 = long long;
#define f for(int i = 0; i < n;++i)
#define ff for(int i = 1; i <= n;++i)
#define int long long 
#define pii pair<int,int>
#define In \ll n; \std::cin >> n;\

const int mod = 1e9 + 7, N = 1e7;struct Lus{int h; int a; int t;
};void solve(){In; std::vector<Lus> lus(n);f std::cin >> lus[i].h;f std::cin >> lus[i].a;f std::cin >> lus[i].t;if(n == 1) {std::cout << 0 << "\n";return ;}std::sort(lus.begin(), lus.end(), [&](const Lus a, const Lus b){return a.t < b.t;});// 排序 + 特判 // 对高度排序, 使用struct记录数据, // 判断当前有多少个满足条件的, 然后根据生长情况判断,// 天数累加情况下寻找满足条件的情况i64 ansL = 0, ansR = 1e9;for(int i = 0; i < n - 1; i ++) {i64 A = lus[i + 1].a - lus[i].a;i64 B = lus[i].h - lus[i + 1].h;if(A > 0) {ansR = std::min(ansR,(i64)ceil((double)B / A) - 1);} else if(A < 0) {ansL = max(ansL,(int)floor((double)B / A) + 1);} else if(B <= 0) {ansR = -1;}}if(ansL > ansR) ansL = -1;std::cout << ansL << "\n";
}signed main(){std::ios::sync_with_stdio(false);std::cin.tie(0); std::cout.tie(0);ll T = 1;std::cin >> T;for(int i = 1; i <= T; ++i) solve();
}

http://www.ppmy.cn/server/172453.html

相关文章

2025年02月26日Github流行趋势

项目名称&#xff1a;aibrix 项目地址url&#xff1a;https://github.com/vllm-project/aibrix项目语言&#xff1a;Jupyter Notebook历史star数&#xff1a;2234今日star数&#xff1a;881项目维护者&#xff1a;Jeffwan, varungup90, brosoul, nwangfw, kr11项目简介&#xf…

【前端基础】3、HTML的常用元素(h、p、img、a、iframe、div、span)、不常用元素(strong、i、code、br)

HTML结构 一个HTML包含以下部分&#xff1a; 文档类型声明html元素 head元素body元素 例&#xff08;CSDN&#xff09;&#xff1a; 一、文档类型声明 HTML最一方的文档称为&#xff1a;文档类型声明&#xff0c;用于声明文档类型。即&#xff1a;<!DOCTYPE html>…

探索区块链数据:使用Python实现区块链数据分析

探索区块链数据&#xff1a;使用Python实现区块链数据分析 在区块链和Web 3.0时代&#xff0c;数据分析变得尤为重要。区块链技术的去中心化和透明性为数据分析提供了丰富的资源和机会。作为区块链与Web 3.0、Python领域的著名自媒体创作者&#xff0c;笔名Echo_Wish&#xff…

【人工智能】GPT-4 vs DeepSeek-R1:谁主导了2025年的AI技术竞争?

前言 2025年&#xff0c;人工智能技术将迎来更加激烈的竞争。随着OpenAI的GPT-4和中国初创公司DeepSeek的DeepSeek-R1在全球范围内崭露头角&#xff0c;AI技术的竞争格局开始发生变化。这篇文章将详细对比这两款AI模型&#xff0c;从技术背景、应用领域、性能、成本效益等多个方…

游戏引擎学习第130天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾 这个节目是我们在直播中编写一个完整的游戏&#xff0c;不使用引擎&#xff0c;也不依赖任何库&#xff0c;完全靠我们自己。现在&#xff0c;我们在某些方面取得了一些进展&#xff0c;做了很多工作&#xff0c;既使我们的…

HIVE中的分组聚合语句

GROUPING SETS使用 grouping sets是一种将多个group by 逻辑写在一个sql语句中的便利写法。 --GROUP BY a, b GROUPING SETS ((a,b)) hive (default)> 1. SELECT order_date,user_id,count(*) FROM ds_hive.ch6_t_order GROUP BY order_date,user_id GROUPING SETS ((orde…

5个GitHub热点开源项目!!

1.自托管 Moonlight 游戏串流服务&#xff1a;Sunshine 主语言&#xff1a;C&#xff0c;Star&#xff1a;14.4k&#xff0c;周增长&#xff1a;500 这是一个自托管的 Moonlight 游戏串流服务器端项目&#xff0c;支持所有 Moonlight 客户端。用户可以在自己电脑上搭建一个游戏…

什么是 Prompt?——一篇详细的介绍

在人工智能&#xff08;AI&#xff09;和自然语言处理&#xff08;NLP&#xff09;的领域&#xff0c;Prompt&#xff08;提示语&#xff09;是与 AI 模型进行交互的核心工具之一。它是一个人类输入的指令&#xff0c;目的是引导 AI 模型执行特定的任务或生成相应的内容。随着生…