优先队列0分求调
查看原帖
优先队列0分求调
633454
LLL789楼主2024/11/27 20:10
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
const int N=2e5+5;
int n,m;
int pt[N];//记录某个打印机在何时能将所有待打印文件打印出来 
vector<int> h[N];//记录每个打印机打印什么文件的vector 
struct T{
	int id;//文件的编号 
	int s;//某文件需要的打印时间 
	int t;//下发命令的时刻 
}d[N];//文件 
bool cmp(T a,T b){//按照下发命令的时刻从小到大排序 
	return a.t < b.t;
}
struct node{
	int id;//打印机编号 
	int pt;//记录某个打印机在何时能将所有待打印文件打印出来
	bool operator < (const node &a) const{
		if(pt == a.pt) return id > a.id;//时间相同就按编号从小到大排 
		else return pt > a.pt;
	}
};
priority_queue<node> qw;//正在工作的打印机(按照剩余时间从小到大排序)
priority_queue<int,vector<int>,greater<int> > ql;
//空闲打印机(按照编号从小到大排序) 
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&d[i].s,&d[i].t);
		d[i].id=i;
	}
	sort(d+1,d+n+1,cmp);
	for(int i=1;i<=m;i++){
		ql.push(i);//初始时所有打印机都空闲 
	}
	for(int i=1;i<=n;i++){//遍历每一个文件i 
		if(!qw.empty() && qw.top().pt < d[i].t){
			ql.push(qw.top().id);//放到空闲打印机队列中
			qw.pop();//出队 
		}
		if(!ql.empty()){//有空闲的打印机能直接使用 
			h[ql.top()].push_back(i); 
			pt[ql.top()]=d[i].s+d[i].t-1;//直接赋值
			ql.pop();
			continue; 
		}
		//没有空闲打印机能直接使用 
		node u=qw.top();
		qw.pop();
		pt[u.id]+=d[i].s;
		qw.push(node{u.id,pt[u.id]});
		h[u.id].push_back(i); 
	}
	for(int i=1;i<=m;i++){
		printf("%d ",h[i].size());
		for(int j=0;j<h[i].size();j++){
			printf("%d ",h[i][j]);
		}
		printf("\n");
	}
	return 0;
}
2024/11/27 20:10
加载中...