The Bucket List
题面
题意
给出n头牛的开始结束时间及占有的桶数量。每个开始结束时间不重复。求用最少的桶满足需求。
分析
题目告诉我们n的范围是不超过100即1e2,所以我们可以知道三次循环对于这题也是绰绰有余的,那么我们就可以利用最简单的暴力模拟所有情况。
模拟题一般有两种做法,一个是从头开始模拟到结束。另外一个是从结束的结果出发发现一些奇特的东西然后会让模拟变得简单。比如之前我博客上有一道back and force,如果从前往后模拟的话,就会发现有很多障碍。但是我们从结果出发的话,我们就可以发现这个题目只有3种结果,从而水到渠成地模拟出来。
但是这题,我们可以直接从开始到结束模拟。具体怎么模拟呢?
首先我们要排序,也就是取奶的顺序。当我们用sort排好顺序之后,我们就可以开始模拟了。
从第一头开始遍历到第n头牛,在开始决策第一头牛要多少桶前需要扫一遍第一头牛到这一头年之前的一头牛,看是否有些桶可以收回来。通过这样遍历就可以知道最后的答案是什么了。
AC代码
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;
struct T{
int s;
int t;
int b;
}a[102];
bool cmp(struct T a,struct T b){
return a.s<b.s;
}
int vis[102];//用完就标记1
int main()
{
int n,i,q,sum=0,left=0,j;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i].s>>a[i].t>>a[i].b;
sort(a+1,a+n+1,cmp);
sum+=a[1].b;
for(i=2;i<=n;i++){
for(j=1;j<=i;j++){
if(vis[j]==1)
continue;
if(j==i){if(left<a[i].b){
sum+=(a[i].b-left);
left=0;
}
else{
left-=a[i].b;
}
break;
}
if(a[i].s>=a[j].t){
vis[j]=1;
left+=a[j].b;//每放一个i的时候就看前面有没有可以收的
}
/*if(left<a[i].b){ sum+=(a[i].b-left); left=0; } else{ left-=a[i].b; } break;*/
}
}
cout<<sum<<endl;
return 0;
}