您的位置:首页 > 其它

Hihocoder #1631 : Cats and Fish 模拟

2017-11-27 15:46 344 查看

题意

现有n个鱼 m个猫 每条猫有吃一条鱼所要花去的时间

问最终x分钟后会有多少只完整的鱼 和不完整的鱼

分析

很像操作系统的资源调度的问题

这种卡时间点的问题向来都要好好把

每个步骤所发生的时间给他具体化

我们看每只猫吃一条鱼花去ci分钟 而他是在这一分钟开始的时刻开始吃的

放到时间轴里就是 0-1-2-3-4-… 、

定义时间点表示在ti分钟之后

所有猫在0时刻开始的时间点申请吃鱼

然后在第ci分钟处吃完 假如这只猫吃一条鱼花3分钟 那么他应该在2,3交界的位置把完成吃完这条鱼

如果把时间轴用循环模拟 应该在循环变量为2的时候完成吃完 那么当第3分钟开始时 也就是3分钟以后

开始申请吃下一条鱼

那么所有的过程模拟下来就是

从开始吃 鱼–不完整的鱼的数量++

吃完的时候 不完整的鱼–

过了下一整点 再开始吃 鱼– 不完整鱼数量++

那么关于如何模拟吃和完成吃的过程

申请吃可以用个堆 优先选择吃的快的

完成吃就可以放到一个完成吃的队列里搞搞

code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int main()
{
int m,n,x;
while(~scanf("%d%d%d",&n,&m,&x))
{
int y=0;
priority_queue<int,vector<int>,greater<int> >eat[3002];
vector<int>fis[3003];
for(int i=1;i<=m;i++){
int t;
scanf("%d",&t);
eat[0].push(t);
}
for(int t=0;t!=x;t++){
//当前分钟 吃的过程
while(!eat[t].empty()){
int to = eat[t].top();//得到此刻申请资源的猫 以及他的速度
eat[t].pop();
if(n>0){
n--,y++;//吃了 把余++
if(to==1)fis[t].push_back(to);//设定完成时间
else fis[t+to-1].push_back(to);//这里不是+to时间 而是在+to和上一分钟的交界处完成 我们把他分给上一分钟
}
}
//当前分钟 吃完成的过程 fis为当前分钟末尾处理
for(int i=0;i<fis[t].size();i++){
int f = fis[t][i];//当前的鱼吃完了
y--;//吃完了后要接着吃 不过是下一分钟开始的时候吃
eat[t+1].push(f);
}
//一个i代表 一个完整的分钟
}
printf("%d %d\n",n,y);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: