90分求助
查看原帖
90分求助
749630
wxzzzz楼主2023/10/5 13:50

反悔贪心。

die码:

#include <bits/stdc++.h>
#define ll long long
#define rll register ll
#define cll const ll
#define N 1000005
using namespace std;
inline ll read()
{
    rll x=0;bool f=1;register char c=getchar();
    while(c<48||c>57){if(c=='-') f=0;c=getchar();}
    while(c>=48&&c<=57){x=x*10+(c^48);c=getchar();}
    return f?x:-x;
}
inline void write(ll x)
{
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+48);
}
ll n,m,k,ans,val,c[N],r[N];
priority_queue<ll,vector<ll>,greater<ll>> q;
struct node{ll p,q;}h[N];
inline bool cmp(node x,node y)
{
	if(x.p==y.p) return x.q>y.q;
	return x.p>y.p;
}
int main()
{
	n=read(),m=read(),k=read();
	for(rll i=1;i<=n;i++) c[i]=read();
	sort(c+1,c+n+1,greater<ll>());
	for(rll i=1;i<=m;i++)
		h[i].q=read(),h[i].p=read();
	sort(h+1,h+m+1,cmp);
	for(rll i=1;i<=k;i++) r[i]=read();
	sort(r+1,r+k+1,greater<ll>());
	for(rll i=1,j=1;i<=n;i++)
	{
		if(j>k)
		{
			q.push(0);
			continue;
		}
		val=0;
		while(j<=k&&h[j].q<c[i])
		{
			val+=h[j].p*h[j].q;
			c[i]-=h[j].q,h[j].q=0,j++;
		}
		if(j<=k)
		{
			val+=c[i]*h[j].p;
			h[j].q-=c[i],c[i]=0;
		}
		ans+=val,q.push(val);
	}//先把能卖奶的都卖了
	for(rll i=1;i<=k;i++)
	{
		if(q.empty()) break;
		cll x=q.top();
		if(r[i]>x)
			ans+=r[i]-x,q.pop();
	}//如果租出去更优,反悔!
	write(ans);
    return 0;
}
2023/10/5 13:50
加载中...