一、D - Buy Low Sell High
题解:将每天的股票价格都放到单调栈中,为了之后遇到比它大的价格时可以卖出去。而且不用在意最大化价值,因为a[ i ]- a[ k ]+ a[ j ] -a[ i ] = a[ j ]- a[ k ],所以在卖出已有股票后需要再次将今天的股票价格压入栈中,作为卖出股票的代替。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
#define has1 __builtin_popcount
const int N =1e6+5;
ll p[N];
void solve(){
int n;
cin>>n;
priority_queue<ll,vector<ll>,greater<ll> >q;
ll sum=0;
for(int i=0;i<n;i++){
cin>>p[i];
bool flag=false;
if(!q.empty()){
int k=q.top();
if(k<p[i]){
flag=true;
sum+=p[i]-k;
//cout<<p[i]<<" "<<k<<endl;
q.pop();
q.push(p[i]);
}
}
q.push(p[i]);
}
cout<<sum<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
//cin >> t;
t=1;
while (t--)
{
solve();
}
return 0;
}
二、[USACO09OPEN] Work Scheduling G - 洛谷
题解:同样需要一个单调队列。在某一个时间只能做一件d[i]小于此时时刻的工作,用双指针判断当前枚举到的工作能否被做,对所有工作得先按时间排序。如此存在后面的工作没有空间放了,但是它的回报比已做的工作大,那么就把回报最小的那份作业变成现在这份。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
#define has1 __builtin_popcount
const int N =1e5+5;
struct node{
int d;
ll p;
}task[N];
bool cmp(node &a,node &b){
if(a.d==b.d)
return a.p>b.p;
else
return a.d<b.d;
}
void solve(){
int n;
cin>>n;
ll sum=0;
for(int i=0;i<n;i++){
cin>>task[i].d>>task[i].p;
}
sort(task,task+n,cmp);
priority_queue<ll,vector<ll>,greater<ll> >q;
for(int i=0,j=1;i<n;i++){
//cout<<task[i].d<<" "<<j<<endl;
if(task[i].d>=j){
sum+=task[i].p;
q.push(task[i].p);
j++;
}
else if(task[i].p>q.top()){
sum+=task[i].p-q.top();
q.pop();
q.push(task[i].p);
}
}
cout<<sum<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
//cin >> t;
t=1;
while (t--)
{
solve();
}
return 0;
}