1 题意:有n个商品,给出它卖出的价值以及必须在第几天之前卖出去(deadline),在某一天只能卖出一种商品。请问最佳的销售计划。
2 分析:
容易想错题意,其样例可能是具有迷惑性的,即你想错了题意其样例也是可能过的。
3
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
const int maxn=10010;
typedef long long ll;
int n;
int order[maxn];
ll ans;
struct Node{
int value;
int date;
}node[maxn];
priority_queue <int> que_temp;
bool cmp(struct Node n1,struct Node n2){
if(n1.date>n2.date){
return 1;//大日期在前
}
else if(n1.date==n2.date){
return n1.value<n2.value;//小价值在前
}
else
return false;
}
void Fun(){
int temp=node[1].date;
int cur=1;
node[n+1].date=-1;
for(int i=temp;i>=1;i--){
int bj=0;
for(int j=cur;j<=n;j++){
if(node[j].date>=i&&node[j].date!=node[j+1].date){
if(!que_temp.empty()&&node[j].value<que_temp.top()){
//cout<<"a"<<endl;
ans+=que_temp.top();
que_temp.pop();
que_temp.push(node[j].value);
cur=j+1;
bj=1;
break;
}
else{
//cout<<"b"<<endl;
ans+=node[j].value;
cur=j+1;
bj=1;
break;
}
}
else if(node[j].date>=i&&node[j].date==node[j+1].date){
//cout<<"c"<<endl;
que_temp.push(node[j].value);
cur=j+1;
}
else{
//cout<<"d"<<endl;
break;
}
}
if(bj==0&&!que_temp.empty()){
//cout<<"e"<<endl;
ans+=que_temp.top();
que_temp.pop();
}
bj=0;
}
}
int main()
{
//freopen("out.txt","w",stdout);
while(~scanf("%d",&n)){
ans=0;
while(!que_temp.empty()){
que_temp.pop();
}
for(int i=1;i<=n;i++){
scanf("%d%d",&node[i].value,&node[i].date);
}
//cout<<""<<endl;
sort(node+1,node+1+n,cmp);
//for(int i=1;i<=n;i++){
// cout<<node[i].value<<" "<<node[i].date<<endl;
//}
Fun();
cout<<ans<<endl;
}
}