首页 > 其他分享 >洛谷-P9455 题解

洛谷-P9455 题解

时间:2023-07-16 22:45:18浏览次数:45  
标签:洛谷 int 题解 mid 塔台 continue ans P9455 贪心

写在前面:本题蒟蒻给出两种做法,一种乱搞贪心(只是目前能过,若能被 Hack 请和我说),一种正解二分。


正文 1

最坏时间复杂度:\(\mathcal{O}(n+\log V)(V=10^9)\)

这个做法是很简单的,在此不多讲。只需要二分超频电压 mid 即可,若当前 mid 可行,则令右边界缩小至 mid,否则令左边界扩大至 mid

代码:

#include<iostream>
using namespace std;
const int N=5e5+7;
int n,a[N],b[N];
bool check(int x){//判定当前超频电压x的值是否可行
  int t=a[1]+b[1]+x;//起始位
  for(int i=2;i<=n;i++)
    if(t>=a[i])//若该塔台可以覆盖下一个塔台
      t=max(t,a[i]+b[i]+x);//求出更远的可以覆盖到的距离
    else return 0;//否则不可行
  return 1;
}
int main(){
  ios::sync_with_stdio(false),cin.tie(0);
  cin>>n;
  for(int i=1;i<=n;i++) cin>>a[i]>>b[i];
  long long l=0,r=1e9+1,mid;
  while(l<r){//二分
    mid=(l+r)>>1;
    if(check(mid)) r=mid;
    else l=mid+1;
  }
  cout<<l;
}

二分 AC 记录

正文 2

最坏时间复杂度:\(\mathcal{O}(n)\)

设答案为 \(x\)。

我们简化一下正文 1 的思路,当塔台 \(i\) 的范围被前一个炮台 \(i-1\) 的范围覆盖,即 \(a_{i-1}+b_{1-1}+x\geq a_i+b_i+x\),我们可以忽略塔台 \(i\) 的范围,直接用塔台 \(i-1\) 的参数贪心即可。

if(a[i]+b[i]+ans>=a[i+1]+b[i+1]+ans)
  {a[i+1]=a[i],b[i+1]=b[i]; continue;}

接下来是贪心,对于每个塔台 \(i\),只需考虑它能否覆盖到 \(i+1\) 即可,因为塔台是有序排列的,后面比前面的远,因此若 \(a_i+b_i+x<a_{i+1}\),\(x=a_{i+1}-a_i-b_i\)。

if(a[i]+b[i]+ans>=a[i+1]) continue;
ans=max(ans,a[i+1]-a[i]-b[i]);

综合一下一个乱搞的贪心就出来了。

代码:

#include<iostream>
using namespace std;
const int N=5e5+7;
int n,ans,a[N],b[N];
int main(){
  ios::sync_with_stdio(false),cin.tie(0);
  cin>>n;
  for(int i=1;i<=n;i++) cin>>a[i]>>b[i];
  for(int i=1;i<n;i++){
    if(a[i]+b[i]+ans>=a[i+1]+b[i+1]+ans)
      {a[i+1]=a[i],b[i+1]=b[i]; continue;}
    if(a[i]+b[i]+ans>=a[i+1]) continue;
    ans=max(ans,a[i+1]-a[i]-b[i]);
  }
  cout<<ans;
}

贪心 AC 记录,可以看到贪心快了 0.17 秒。

后附

日志

v1.0 on 2023.07.16: 发布

标签:洛谷,int,题解,mid,塔台,continue,ans,P9455,贪心
From: https://www.cnblogs.com/wanguan/p/17558757.html

相关文章

  • 230226题解
    A数列题目描述给定一个长为\(n\)的数列\(A_1,A_2,…,A_n\)。给出\(q\)次询问,每次询问给定\(X\),请你回答至少需要多少次操作,能够让数列中的每个数都变成\(X\)。每次操作你可以选择数列中的一个数加\(1\)或者减\(1\)。询问之间相互独立。输入格式第一行两个整数\(n,q\)。第......
  • 洛谷 Luogu P1038 [NOIP2003 提高组] 神经网络
    这题看着很吓人实则很简单。求输出层,正着求很麻烦,因为知不道谁连向这个点,所以可以反向建边,反着求。拓扑+dfs,时间复杂度\(\text{O(n+m)}\)#include<iostream>#include<cstdio>#include<queue>#defineN105#defineM(N*N/2+114)structE{intv,w;......
  • 题解 HDU5726【GCD】/ LGT353762【Soso 的最大公约数】
    Problem给你一个长为\(N(1\leqN\leq1\times10^5)\)的整数序列:\(a_{1},\cdots,a_{n}(0<a_{i}\leq1\times10^9)\)。有\(Q(1\leqQ\leq1\times10^5)\)次提问。每次提问有个范围\(l,r\),你需要计算出\(\gcd(a_{l},,a_{l+1},...,a_{r})\),并且统计数对\((l’,r’......
  • Codeforces Round 896 Div2 A-D题解
    CodeforcesRound896A.Politics这题问的是,给一些人的在n个议题的观点,然后你可以随意安排顺序,每个议题人多的赢,反对派会离开,问随便安排议题,最多留下多少人,包括我自己这个题刚开始愣了半天,但是想到,那只要把所有和我观点一致的给留下来不就行了???然后交上去就AC了ACCode#inclu......
  • 题解 CF1842H【Tenzing and Random Real Numbers】
    看了题解。好难受,想用积分求概率,算了半天。发现没啥规律,不是不能算,就是太可怕了。Problem有\(n\)个\([0,1]\)范围内的均匀随机变量\(x_{1\cdotsn}\)和\(m\)条限制,每条限制形如\(x_i+x_j\le1\)或\(x_i+x_j\ge1\)。请你求出所有限制均满足的概率。对\(998244353\)......
  • Noip优质模拟赛口胡题解
    HDU5719题意概括:第一行输入t表示输入数据,每组数据第一行n,表示对1—n进行排序。接下来输入n个数b[n]表示排列中第i个数之前的最小值为b[i]。第三行n个数c[n],表示排列中第i个数之前的最大值为c[i]。解题思路:递推,排除掉6种不可能的情况,1、b[i]>b[i-1]2、c[i]<c[i-1]3、b[i]......
  • 2023.07.16 高质量 NOIP 模拟赛题解
    HDU5719Arrange【模拟】给定数列\(B_n,C_n\),求出满足\[B_i=\min_{j=1}^i\{A_j\},\quadC_i=\max_{j=1}^i\{A_j\}\]的排列\(A\)的数量。维护每个位置可能的数字数量,然后乘法原理即可。代码:http://acm.hdu.edu.cn/viewcode.php?rid=38654445。HDU5807KeepInTouch......
  • HHHOJ #1247. 「NOIP 2023 模拟赛 20230715 A」1 题解--zhengjun
    法老找来的题,说是找了三道其他模拟赛的T4拼成T1~T3,另外搞了道T4。思维好题,但是放在T1有点搞心态,但是还好大样例够强,400没挂。然而T3大样例输出错了,浪费了我0.5h,差评。首先发现向左走之后向右走是一定不优的,所以最短路的情况只能先向右再向左。考虑枚举起点\(s......
  • 题解 P2839【[国家集训队] middle】
    Problem一个长度为\(n\)的序列\(a\),设其排过序之后为\(b\),其中位数定义为\(b_{n/2}\),其中\(a,b\)从\(0\)开始标号,除法下取整。给你一个长度为\(n\)的序列\(s\)。回答\(Q\)个这样的询问:\(s\)的左端点在\([a,b]\)之间,右端点在\([c,d]\)之间的子区间中,最大的中......
  • 你省(福建)省队集训 Day5 T1 题解
    简要题意有两个正整数\(a<b\le10^9\),给出\(\dfrac{a}{b}\)的小数点后\(19\)位,要求还原\(a,b\),保证有解。solution一个科技:\(\texttt{Stern-Brocottree}(SBT)\),可以参考这个博客学习。先给出\(O(n)\)找的代码:......