模板【分配任务问题】

1.n个任务,endTime[i],costTime==1,value[i],使得得到的value最大

2.分配任务问题,像这种要排序的东西, 反复使用就得留心

n个任务,endTime[i],costTime[i],value[i]==1,使得做的任务最多

题解【J-Taxed Editor 】 这个题深刻加深了对此算法的理解,而且错了好多次

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<cstring>
#include<string>
#include<vector>
#include<queue>
#include<iomanip>
#include<iostream>
#include<stack>
using namespace std;

///-------------------------------------------------------常用规定部分
//----------------------通用
#define inf_ 0x3f3f3f3f//这是给int的inf,值为1061109567,2^31-1为2147483647
#define reg_ register int
#define for_reg(i, n) for(reg_ i = 1; i <= n; i++)
#define ll_ long long
#define ull_ unsigned long long
//----------------------边访问
#define visit_edge int i = p[u]; ~i; i = e[i].next
#define define_v int v = e[i].v
#define define_v_avoid_f int v = e[i].v;if(v == fa) continue
//----------------------线段树
#define mid_ int mid = (l+r)>>1//mid的定义
#define len_ (r-l+1)
#define l_id id<<1
#define r_id id<<1|1
#define l_son id<<1,l,mid
#define r_son id<<1|1,mid+1,r
#define include_(x,y,l,r) x<=l && r<=y
//----------------------其它
const int max_n = 1e2+10;
const int max_m = 1e4+10;
///-------------------------------------------------------变量声明部分
//--------------------------------------其它
struct TASK
{
    ll_ costTime, endTime;
    bool operator < (const TASK & tmp) const
    {
        return costTime < tmp.costTime;
    }
} taskg[max_n];
priority_queue<int> choosedTask;//记录选中task的花费时间的最大值
///--------------------------------------------------------函数声明部分
//--------------------------------------其它

///--------------------------------------------------------main函数部分
int main()
{
    //freopen("in.txt","r", stdin);
    //freopen("out.txt","w", stdout);
    ios::sync_with_stdio(false);
    //InitEdge();
    int n;
    cin >> n;
    for_reg(i, n)
    {
        cin >> taskg[i].costTime >> taskg[i].endTime;
    }
    sort(taskg+1, taskg+1+n);
    ll_ costedTime = 0, choosedNumber = 0;
    for_reg(i, n)
    {
        if(costedTime + taskg[i].costTime > taskg[i].endTime && !(choosedTask.size() && choosedTask.top() > taskg[i].costTime))
            continue;
        costedTime += taskg[i].costTime;
        if(costedTime < taskg[i].endTime)
            choosedNumber++;
        else
        {
            costedTime -= choosedTask.top();
            choosedTask.pop();
        }
        choosedTask.push(taskg[i].costTime);
    }
    cout << choosedNumber <<endl;
    return 0;
}
///--------------------------------------------------------函数定义部分
//----------------------------------其它

 

posted @ 2021-07-23 10:02  bear_xin  阅读(40)  评论(0编辑  收藏  举报