一开始想到是贪心了,以为是每次找出最高价格,然后在前面寻找最小的、次小的...直至所有的股票卖完或者达到卖股票的上限,超时超到死啊。。。。。后来才明白,从最后一个元素开始贪心,并用优先队列进行组织,可达到O(nlgn)的时间复杂度,这回是真的长见识了。。。。
为什么从最后一个开始呢?原因也很简单,最后一天的股票只能在最后一天卖出去,其他天数的股票只能在当天以及以后的天数里卖出去,从这里面选一个最高价格进行贪心即可。大体就是这样的,比较细致的地方大家可以自己再好好想想。
不过想到这种贪心方法,真的真的很不容易,最起码我有这种感觉。。。。
#include<iostream>
#include<queue>
#include<stdio.h>
using namespace std;
struct Node{
int acquire;
int price;
int sell;
friend bool operator< (Node n1,Node n2){
return n1.price<n2.price;
}
};
Node node[100005];
priority_queue<Node> q;
int main(){
int t,sum,n;
cin>>t;
while(t--){
sum=0;
cin>>n;
for(int i=0;i<n;i++)
cin>>node[i].acquire>>node[i].price>>node[i].sell;
while(q.empty()==false)
q.pop();
for(int i=n-1;i>=0;i--){
q.push(node[i]);
//Node tmp=q.top();
while(q.empty()==false&&node[i].acquire>0){
Node tmp=q.top();
q.pop();
if(tmp.sell>node[i].acquire){
sum+=node[i].acquire*tmp.price;
tmp.sell-=node[i].acquire;
node[i].acquire=0;
q.push(tmp);
}
else{
node[i].acquire-=tmp.sell;
sum+=tmp.sell*tmp.price;
}
}
}
cout<<sum<<endl;
}
//system("pause");
return 0;
}