首页 > 其他分享 >POJ - 1456 Suprtmarket

POJ - 1456 Suprtmarket

时间:2022-11-30 18:13:34浏览次数:61  
标签:val int find 1456 POJ 物品 inf 期限 Suprtmarket

POJ - 1456 Suprtmarket

题目大意:传送门

有\(n\)个物品,第\(i\)个物品必须要在\(d_i\)天内买完,且卖出该物品可以获得\(p_i\)的利润。一天只能卖一个物品,求最多可以获得多少利益


题目分析:

每天可以卖一件商品,那么每天卖的物品一定要是不超过期限的物品中最贵的一个物品。

我们最后一天卖的物品一定是期限为\(d_{max}\)的物品中最贵的物品

第\(d_{max}-1\)天卖的物品则一定是期限小于等于\(d_{max}-1\)的物品或者其余期限为\(d_{max}\)的物品中最贵的物品

以此类推

此题为贪心题,我们可以用并查集优化时间复杂度

我们可以按价格降序排列,对于每个商品,如果时间和之前的商品没有冲突,那么就直接卖出。如果发生了冲突,那么就说明这一天不能卖商品了,就将发生冲突的商品的期限减一天(该过程可能发生多次)。

如何用并查集维护?

用并查集维护原期限为d的商品的新期限

find(d)<1:期限小于1,无法卖出

find(d)>=1:可以卖出,卖出之后p[find(d)]=find(d)-1;


题目代码:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 1e4 + 10;
int n, p[N];

struct node
{
	int val, day;
}inf[N];

bool cmp(struct node a, struct node b)
{
	return a.val > b.val;
}

int find(int x)
{
	if (p[x] != x)
		p[x] = find(p[x]);
	return p[x];
}

int main()
{
	while (cin >> n)
	{
		for (int i = 0; i < N; i++) //初始化p[i]=i,期限为i的商品的最初期限为i
		{
			p[i] = i;
		}

		for (int i = 1; i <= n; i++)
		{
			cin >> inf[i].val >> inf[i].day;
		}
		sort(inf + 1, inf + 1 + n, cmp);

		int ans = 0;
		for (int i = 1; i <= n; i++)
		{
			int day = find(p[inf[i].day]);
			if (p[day] < 1)
				continue;
			else
			{
				ans += inf[i].val;
				p[day] = day - 1; //期限减一天
			}
		}
		cout << ans << endl;
	}
}

标签:val,int,find,1456,POJ,物品,inf,期限,Suprtmarket
From: https://www.cnblogs.com/shw940795634/p/16939305.html

相关文章

  • POJ-3263 Tallest Cow
    思路分析(摘自这篇博客)这道题目一个核心要点,就是如何处理这些特殊的关系,也就是两头牛互相看见。其实题目中已经告诉我们如何处理,因为我们发现,题目中要求牛的身高最高,那......
  • SPOJLCMSUM - LCM Sum
    简要题意\(T\)组数据,每组数据给出一个\(n\),计算:\[\sum_{i=1}^{n}{\operatorname{lcm}(i,n)}\]\(1\leqT\leq3\times10^5,1\leqn\leq10^{6}\)思路比较快乐的......
  • POJ3252 Round Numbers
    终于一遍就写对了.第一次没有注意读题导致了一个没有注意到什时候要开始统计.Code#include<iostream>#include<string>#defineintlonglongusingnamespacestd;......
  • POJ2406-Power Strings
    PowerStringsTimeLimit: 3000MS MemoryLimit: 65536KTotalSubmissions: 55320 Accepted: 22983DescriptionGiventwostringsaandbwedefinea*b......
  • POJ2104-K-th Number(浅析主席树)
    K-thNumberTimeLimit: 20000MS MemoryLimit: 65536KTotalSubmissions: 65162 Accepted: 22979CaseTimeLimit: 2000MSDescriptionYouareworkingforMac......
  • BZOJ1036-[ZJOI2008]树的统计Count&&POJ3237-Tree
    为什么把这两题放在一起呢,因为这两题其实是一道题,只是输入顺序不一样。这里主要以BZOJ1036为例。1036:[ZJOI2008]树的统计CountTimeLimit: 10Sec  MemoryLimit: ......
  • POJ2001-Shortest Prefixes
    ShortestPrefixesAprefixofastringisasubstringstartingatthebeginningofthegivenstring.Theprefixesof"carbon"are:"c","ca","car","carb",......
  • POJ2299-Ultra-QuickSort
    Ultra-QuickSortInthisproblem,youhavetoanalyzeaparticularsortingalgorithm.Thealgorithmprocessesasequenceofndistinctintegersbyswappingtwo......
  • poj 1423 Big Number<<求N!位数>>
    BigNumberTimeLimit:1000MSMemoryLimit:65536KTotalSubmissions:27542Accepted:8789DescriptionInmanyapplicationsverylarg......
  • poj 2506 Tiling 《大数加法+递推》
    TilingTimeLimit:1000MS MemoryLimit:65536K TotalSubmissions:8689 Accepted:4183 DescriptionInhowmanywayscanyoutile......