专栏文章
题解:P13594 『GTOI - 1A』Bath
P13594题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mioic6jl
- 此快照首次捕获于
- 2025/12/02 19:41 3 个月前
- 此快照最后确认于
- 2025/12/02 19:41 3 个月前
Solution
题意为小H的洗澡水初始温度为 度,他能接受的温度范围是 。在洗澡期间,有 个人会在不同的时刻 使用水龙头,导致水温变化 ( 为正表示升温,为负表示降温)。同一时刻的所有变化是同时发生的。小H可以在任意时刻调整水温到任意值,但希望调整次数最少,使得在所有时刻水温都在 范围内。求最少需要调整多少次。
这道题我们可以首先将所有事件按时间顺序处理,从初始温度开始,按时间顺序应用每个时刻的温度变化。
然后当某个时刻的温度变化会导致水温超出 范围时,必须在此前进行调整。
调整的目标是找到一个新温度 ,使得 。
调整后,后续的温度变化基于新的 。
为了最小化调整次数,每次调整时应尽可能选择一个温度,使得后续尽可能多的变化不会导致超出范围。这可以通过维护一个“可行温度区间”来实现。
AC code
CPP#include <bits/stdc++.h>
using namespace std;
struct p{
int t,x;
}a[100003];
bool cmp(p b, p c)
{
return b.t<c.t;
}
int n,s,l,r,ans,i,b,c;
int main()
{
cin>>n>>s>>l>>r;
for(int i=0;i<n;i++)
cin>>a[i].t>>a[i].x;
sort(a,a+n,cmp);
b=s,c=s;
while(i<n)
{
int x=a[i].t,y=0;
while(i<n&&a[i].t==x)
y+=a[i].x,i++;
if(b+y>r||c+y<l) ans++,b=l,c=r;
else b=max(b+y,l),c=min(c+y,r);
}
cout<<ans;
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...