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; } ///--------------------------------------------------------函数定义部分 //----------------------------------其它