zoukankan      html  css  js  c++  java
  • [BZOJ 1029] [JSOI2007] 建筑抢修 【贪心】

    题目链接:BZOJ - 1029

    题目分析

    使用一种贪心策略。

    现将任务按照deadline从小到大排序。

    然后枚举每一个任务,如果当前消耗的时间加上完成这个任务的时间不会超过这个任务的deadline,那么就完成这个任务。

    否则,如果完成这个任务的时间比之前选择完成的任务中完成时间最长的一个要短,那么就弹出之前完成的那个任务,换上当前的这个任务。

    这样当前的答案没有变,当前消耗的时间却减少了。

    用堆来实现取最大值的操作。

    代码

    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <queue>
    
    using namespace std;
    
    const int MaxN = 150000 + 5;
    
    int n, Ans, Time;
    
    struct ES
    {
    	int Ct, DL;
    } E[MaxN];
    
    bool Cmp(ES e1, ES e2) 
    {
    	return e1.DL < e2.DL;
    }
    
    priority_queue<int> Q;
    
    int main() 
    {
    	scanf("%d", &n);
    	for (int i = 1; i <= n; ++i) scanf("%d%d", &E[i].Ct, &E[i].DL);
    	sort(E + 1, E + n + 1, Cmp);
    	Time = 0; Ans = 0;
    	while (!Q.empty()) Q.pop();
    	for (int i = 1; i <= n; ++i)
    	{
    		if (Time + E[i].Ct <= E[i].DL) 
    		{
    			Time += E[i].Ct;
    			Q.push(E[i].Ct);
    			++Ans;
    		}
    		else 
    		{
    			if (Q.empty()) continue;
    			if (E[i].Ct < Q.top()) 
    			{
    				Time -= Q.top();
    				Q.pop();
    				Time += E[i].Ct;
    				Q.push(E[i].Ct);
    			}
    		}
    	}
    	printf("%d
    ", Ans);
    	return 0;
    }
    

      

  • 相关阅读:
    ExIco应用程序图标保存器1.0发布
    Object.defineProperty
    es6代理 proxy 学习
    node js学习记录
    css默认值列表
    关于 keyup keydown keypress
    转载一篇关于css选择器的,很透彻
    ......图片上传
    mimi
    css 开发心得
  • 原文地址:https://www.cnblogs.com/JoeFan/p/4319054.html
Copyright © 2011-2022 走看看