萌新刚学OI1ms,站外题求助
  • 板块题目总版
  • 楼主Wildchesse
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/2/13 11:26
  • 上次更新2023/10/24 00:54:41
查看原帖
萌新刚学OI1ms,站外题求助
362022
Wildchesse楼主2023/2/13 11:26

工作安排 题目描述 为了维持农场的运转,约翰必须打工赚钱。他接到了 N 份工作,每份工作恰好占用他一天的时间。 约翰从第一天开始工作,他可以任意安排这些工作的顺序,第 i 份工作有 P_i的报酬,但必须在D_i 天结束之前完成。在截止日期后完成的工作没有报酬。请帮助约翰规划每天的工作,使得他赚到的钱最多。

输入格式 第一行:单个整数 N 第二行到N+1行:第i+1行有两个整数:D_i和P_i

输出格式 单个整数,表示约翰最多可以赚多少钱

数据范围

1<=N<=1e5

1<=DiPi<=1e9

#include<bits/stdc++.h>
#define int long long
#define MAXN 100005
using namespace std;
struct node{
	int t,v;
};
int n,ans=0;
node a[MAXN];
priority_queue<int,vector<int>,greater<int> > q;
bool cmp(node a,node b){
	if(a.t==b.t){
		return a.v>b.v;
	} 
	return a.t<b.t;
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i].t>>a[i].v;
	}
	sort(a+1,a+n+1,cmp);
	q.push(a[1].v);
	ans+=a[1].v;
	for(int i=2;i<=n;i++){
		if(a[i].t!=a[i-1].t){
			q.push(a[i].v);
			ans+=a[i].v;
		}
		else{
			if(q.top()<a[i].v){
				ans-=q.top();
				q.pop();
				q.push(a[i].v);
				ans+=a[i].v;
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

2023/2/13 11:26
加载中...