(2019 GDUT Rating Contest #I)A. The Bucket List

本文通过模拟过程解决奶牛挤奶问题,利用结构体记录每头奶牛的挤奶时间和所需铁桶数,通过排序和队列操作,计算农夫至少需要准备的铁桶数量,提供了一种有效的问题解决思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门

题目大意:

农夫要给奶牛挤奶,他已经规划好了奶牛要挤奶的时间和结束挤奶的时间,每头奶牛有它自己产奶时需要的铁桶数,问农夫至少需要几个铁桶?

题目分析:

一开始没什么思路,但就想模拟一下过程。
我们用个结构体记录一下每头奶牛的开始挤奶时间,挤奶的时间,需要的铁桶数。再给奶牛的开始时间排下序。剩下事情我们就交给队列来干(这里我用数组模拟队列,也可以用优先队列),我用了个数组 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值