您的位置:首页 > 其它

POJ 1456 Supermarket

2015-11-03 23:49 260 查看
贪心,按时间排个序,再一个个地添加

有空位就直接放进去,没空位就覆盖价值更小的

#include <cstdio>
#include <set>
#include <algorithm>
using namespace std;

struct P{int v, d;}p[10005];
bool operator < (P a, P b) {return a.d < b.d;}
multiset<int> S;
multiset<int>::iterator it;

int main()
{
int n;

while(~scanf("%d", &n))
{
S.clear();

for(int i = 1; i <= n; i++)
scanf("%d%d", &p[i].v, &p[i].d);
sort(p + 1, p + n + 1);

for(int i = 1; i <= n; i++)
{
if(S.size() < p[i].d)
S.insert(p[i].v);
else
{
if(*S.begin() >= p[i].v) continue;
S.erase(S.begin());
S.insert(p[i].v);
}
}

int sum = 0;
for(it = S.begin(); it != S.end(); it++)
sum += *it;

printf("%d\n", sum);
}

return 0;
}

也可以按价值排序,再一个个地添加

从截止时间往前找空位

用并查集优化,用set也可以

根结点是没有用过的点,子结点是用过了的点

#include <cstdio>
#include <algorithm>
using namespace std;

struct P{int v, d;}p[10005];
bool operator < (P a, P b) {return a.v > b.v;}
int fa[10005];

int find(int n)
{
if(fa
== 0)
return 0;
if(fa
!= n)
fa
= find(fa
);
return fa
;
}

int main()
{
int n;

while(~scanf("%d", &n))
{
int Max = 0;
for(int i = 1; i <= n; i++)
{
scanf("%d%d", &p[i].v, &p[i].d);
if(Max < p[i].d) Max = p[i].d;
}
for(int i = 0; i <= Max; i++)
fa[i] = i;
sort(p + 1, p + n + 1);

int sum = 0;
for(int i = 1; i <= n; i++)
{
int k = find(p[i].d);
if(k == 0) continue;
fa[k] = fa[k - 1];
sum += p[i].v;
}

printf("%d\n", sum);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: