传送门
题目大意:
农夫要给奶牛挤奶,他已经规划好了奶牛要挤奶的时间和结束挤奶的时间,每头奶牛有它自己产奶时需要的铁桶数,问农夫至少需要几个铁桶?
题目分析:
一开始没什么思路,但就想模拟一下过程。
我们用个结构体记录一下每头奶牛的开始挤奶时间,挤奶的时间,需要的铁桶数。再给奶牛的开始时间排下序。剩下事情我们就交给队列来干(这里我用数组模拟队列,也可以用优先队列),我用了个数组 q 存桶的使用时间(就是对于每头奶牛,它需要多少个桶,我就把多少个桶存进去,比如这头奶牛:开始时间:10,结束挤奶时间 25,需要三个桶,我令q [ 0 ] = 25,q [ 1 ] = 25, q [ 2 ] = 25,这样我就存了3个桶进去)。这样我每次需要桶的时候判断桶的使用时间有没有到以及桶够不够,不够就加桶。
代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int maxn = 1e2+5;
const int max_n= 1e3+5;
int vis[max_n];
int q[max_n];
struct cow{
int s;
int t;
int b;
};
cow c[maxn];
bool cmp(cow x,cow y){
if(x.s==y.s) return x.t<y.t;
return x.s<y.s;
}
int main(){
int cnt=0;
int n;cin>>n;
for(int i=0;i<n;i++){
scanf("%d %d %d",&c[i].s,&c[i].t,&c[i].b);
}
sort(c,c+n,cmp);
for(int i=0;i<n;i++){
if(cnt==0||q[0]>c[i].s){
for(int j=1;j<=c[i].b;j++){
q[cnt]=c[i].t;
cnt++;
}
}
else{
int num=0;
while(cnt!=0&&q[num]<=c[i].s){
if(c[i].b==0) break;
q[num]=c[i].t;
c[i].b--;
num++;
}
if(c[i].b!=0){
for(int j=1;j<=c[i].b;j++){
q[cnt]=c[i].t;cnt++;
}
}
}
sort(q,q+cnt);
}
cout<<cnt<<endl;
return 0;
}