POJ 1456-スーパーマーケット(貪欲+の互いに素なセット)

スーパーマーケット

制限時間:2000msのメモリ制限:65536kも
合計提出:23513受理:10318

説明

スーパーマーケットは、販売上の製品のセット製品版を持っています。これは、販売が始まる瞬間から始まる時間単位の整数として測定された期限dxだけ販売された各製品x∈Prodの利益PXを稼いでいます。各製品は、販売されるため、正確に時間の1つの単位を取ります。販売スケジュールは、製品の注文サブセットは≤売るの順序に従って、各製品の販売x∈Sellは、完了期限DX前または単にDXの有効期限が切れるよう製品版を販売です。販売スケジュールの利益は、利益(売る)=Σx∈Sellpxです。最適な販売スケジュールは、最大の利益を持つ予定です。
例えば、製品を考えるのProd = {A、B、C、D}(PA、DA)と=(50,2)、(PB、DB)=(10,1)、(PC、DC)=(20 、2)、及び(PD、DD)=(30,1)。可能販売スケジュールは、例えば表1に記載されている、スケジュール売り= {D}示すこと時間0および時間1における両端の製品Dの開始の販売、しばらく時間1での製品の販売が開始されると時間2.これらの製品のそれぞれの両端には、その期日までに販売されています。販売は、最適なスケジュールであり、その利益は80です。
ここに画像を挿入説明
入力テキストファイルから製品のセットを読み取り、製品の各セットに最適な販売スケジュールの利益を計算プログラムの書き込み。
入力

製品のセット整数の集合における製品の数である整数0 <= N <= 10000で始まり、そしてに続くN個の対PIジ、1 <= PI <= 10000および1 <=ジ<=利益とi番目の製品の販売期限を指定10000、。ホワイトスペースは、入力中に自由に発生する可能性があります。入力データは、ファイルの終わりで終了し、正しいことが保証されています。
出力

製品の各セットのために、プログラムは標準出力にセットに最適な販売スケジュールの利益を印刷します。それぞれの結果は、別の行の先頭から印刷されます。

サンプル入力

4 50 2 10 1 20 2 30 1

7 20 1 2 1 10 3 100 2 8 2
5 20 50 10

サンプル出力

80
185

スーパーマーケットは、N個の製品を持っている。パイの利益は。場合、私は番目の商品を販売するスーパーマーケットが可能、保証期間(日ジ)の前に売却しなければならない
だけで毎日の製品を販売することができます。
今、あなたは利益のスーパーマーケットを最大化したいです。

入力
データの複数のセット。
各試験Nの整数(0 <= N <= 10000)、 スーパーマーケットの商品の数、すなわち
2行は、N、I、PI、ジ(1 <= PIの挙動整数した後 、 ディ<= 10000)

出力
条件スーパーマーケットの下でデータの各セット、最大出力電流の利益のために

サンプル入力
4
50 2
10 1
20 2
30 1

7
20 1
2 1
10 3
100 2
8 2
5 20
50 10

サンプル出力
80
185

効果の件名:与えられたn個すべての商品の期限が切れているの前に最大の利益を求めている商品、商品のみを販売する一日の値と貯蔵寿命とのそれぞれが、取得することができます。

問題解決のアイデア:私は利益を最大化したかったので、この質問は、貪欲やアイデアの互いに素-セットはおよそ、設定値と構造ノードの貯蔵寿命は、各商品のために保存されていると思うすることができ、商品の最高値があるため、毎日販売されています価値商品の栗の貯蔵寿命1 203 050、商品2秒ため50 60 70、60及び70の貯蔵寿命の場合:最大の利益は毎日は必ずしも同じではありません得るので、各製品は、貯蔵寿命を有します天才は、我々は次の日に、選択50品目、70品目の最初の日を選んだので、私たちは最大の利益を得ることができ、1の203050を販売する最初の日でない場合は、次の日には有効期限が切れとなり、有効期限が切れまず、すべての製品構造体の配列、配列をソートする降順の値に格納されている情報、およびの値が下降しているので、アイデアのセットを確認し、商品の最高値は70だったと仮定すると、2の彼の貯蔵寿命、そして彼によると次の日は、2(602)の商品棚寿命がある場合は翌日の最大値を使用することができないで、それは私のみの販売初日に2-1で行くことができる、確かではありません。ACコード:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int _max=1e5+50;
struct node {int p,d;};
int f[_max];
node a[_max];
bool cmp(node a,node b) {return a.p>b.p;}
int find(int x)
{
	if(f[x]==-1)
	  return x;
    return f[x]=find(f[x]);
}
int main()
{
	ios::sync_with_stdio(false);
	int n;
	while(cin>>n)
	{
		memset(f,-1,sizeof f);//初始化为-1表示一开始都没被占用
		for(int i=0;i<n;i++)
		  cin>>a[i].p>>a[i].d;
		sort(a,a+n,cmp);//按照价值降序
		int sum=0;
		for(int i=0;i<n;i++)
		{
			int x=find(a[i].d);//检查该商品的保质期之内是否能销售
			if(x>0)
			{
				f[x]=x-1;//表示这天已经被占用了  自己减一
				sum+=a[i].p;
			}
		}
		cout<<sum<<endl;
	}
	return 0;
}
公開された38元の記事 ウォンの賞賛1 ビュー1175

おすすめ

転載: blog.csdn.net/aezakmias/article/details/104799698