题目
Farmer John 正在考虑改变他给奶牛挤奶的时候分配牛奶桶的方式。
他认为这最终能使得他使用数量更少的桶,然而他不清楚具体是多少,请帮助他!
Farmer John 有 NN 头奶牛,方便起见编号为 1…N1…N。
第 ii 头奶牛需要从时刻 sisi 到时刻 titi 之间挤奶,并且挤奶过程中需要用到 bibi 个桶。
多头奶牛可能在同一时刻都在挤奶;每个桶在每个时刻只能供一头奶牛使用。
也就是说,第 ii 头奶牛在时刻 sisi 到时刻 titi 之间挤奶时,如果用到了某个桶,则该桶在这段时间不能被其他奶牛使用。
当然,这个桶在这段时间之外可以被其他奶牛所使用。
为了简化他的工作,FJ 保证在任一时刻,至多只有一头奶牛开始或是结束挤奶(也就是说,所有的 sisi 和 titi 各不相同)。
FJ 有一个储藏室,里面有依次编号为 1、2、3、……1、2、3、…… 的桶。
在他的挤奶策略中,当某一头奶牛(比如说,奶牛 ii)开始挤奶(在时刻 sisi),FJ 就跑到储藏室取出编号最小的 bibi 个桶分配给第 ii 头奶牛用来挤奶。
请求出 FJ 需要在储藏室中存放多少个桶才能使得他能够顺利地给所有奶牛挤奶。
输入格式
输入的第一行包含 NN。
以下 NN 行,每行描述了一头奶牛,包含三个空格分隔的数 si,ti,bisi,ti,bi。
其中 sisi 和 titi 均为 1…10001…1000 之间的整数,bibi 为 1…101…10 之间的整数。
输出格式
输出一个整数,为 FJ 需要的桶的数量。
数据范围
1≤N≤1001≤N≤100
输入样例:
3
4 10 1
8 13 3
2 6 2
输出样例:
4
样例解释
在这个例子中,FJ 需要 44 个桶:他用桶 11 和桶 22 来给奶牛 33 挤奶(从时刻 22 开始)。
他用桶 33 给奶牛 11 挤奶(从时刻 44 开始)。
当奶牛 22 在时刻 88 开始挤奶时,桶 11 和桶 22 可以再次利用,然而桶 33 不可以,所以他会使用桶 11、桶 22 和桶 44。
解释和代码
根据题意,由于数据较少,可以新建一个桶,把 s i s_i si到 t i t_i ti的数量 b i b_i bi依次加上,然后遍历找max即可
#include <bits/stdc++.h>
#define pb push_back
#define ppb pop_back
#define lbnd lower_bound
#define ubnd upper_bound
#define endl '\n'
#define all(a) (a).begin(),(a).end()
#define what_is(x) cerr << #x << " is " << x << endl;
#define ini(a) memset(a,0,sizeof(a))
#define case ll T;read(T);for(ll Q=1;Q<=T;Q++)
#define lowbit(x) x&(-x)
#define pr printf
#define sc scanf
#define TIE \
cin.tie(0);cout.tie(0);\
ios::sync_with_stdio(false);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
const ll LLINF = 0x3f3f3f3f3f3f3f3f;
const int maxn = 9990;
const ll N = 5;
int flag[maxn] = {0};
void solve(){
int n, ans = 0;
int s, t, b;
cin>>n;
for (int i=1; i<=n; i++) {
cin>>s>>t>>b;
for (int j=s; j<=t; j++) {
flag[j] += b;
}
}
for (int i=0; i<=1000; i++) {
ans = max(ans, flag[i]);
}
cout<<ans<<endl;
}
int main()
{
// TIE;
solve();
// case{solve();}
// case{cout<<"Case "<<Q<<":"<<endl;solve();}
}