维护天数和价值的递增的序列(用结构体 + sort实现),
对天数进行枚举,输出当前天数以及当前天数之后的最大的价值,并将这个价值的访问
数组置为1,下次不再访问.累加获得res,输出结果.
居然用暴力枚举AC了,200ms
描述
Rainbow开了一家商店,在一次进货中获得了N个商品。
已知每个商品的利润和过期时间。
Rainbow每天只能卖一个商品,并且过期商品不能再卖。
Rainbow也可以选择在每天出售哪个商品,并且一定可以卖出。
由于这些限制,Rainbow需要制定一份合理的售卖计划。请你计算一下,Rainbow最终可以获得的最大收益。
输入
第一行两个整数N。
接下来N行每行两个整数,分别表示每个商品的利润、过期时间。
1<=N,利润,时间<=10000。
输出
输出一个整数,表示Rainbow最终可以获得的最大收益。
样例输入
7
20 1
2 1
10 3
100 2
8 2
5 20
50 10
样例输出
185
//从后向前检索,输出当前时间段之后的最大值
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
int n, flag = -1, mmax, index_;
int vis[11000];
long long res;
struct goods
{
int val, day;
}g[11000];
bool cmp(goods a,goods b)
{
return (a.day<b.day || (a.day==b.day&&a.val<b.val));
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d%d",&g[i].val,&g[i].day);
sort(g,g+n,cmp);
for(int i=g[n-1].day;i>=1;i--)//枚举天数
{
mmax = 0;
for(int j=n-1;g[j].day>=i;j--)//当前天以及当前天之后的货物
{
if(vis[j]==0 && g[j].val>mmax)//找出最大的输出
{
index_ = j;
mmax = g[j].val;
}
}
vis[index_] = 1;
res += mmax;
}
printf("%lld\n",res);
return 0;
}