貪欲なエントリの基本(読み込みの問題、間隔の数、ハフマン(優先キュー))

貪欲なアルゴリズムの基盤(超基本的な種類)

貪欲法は問題解決戦略です。正しければ、貪欲な方法は簡単に説明して実装できます

読み込みの問題

n個のオブジェクトを指定すると、各オブジェクトのボリュームはmiで、単価はpiです。ボリュームがmのバックパックがあります。いくつが
最も高価か尋ねてください。(オブジェクトを分割できると仮定)。
最初に、構造と構造の配列を定義し、単価が最も高いオブジェクトを選択する必要があるたびに、単価を降順に並べ替える必要があります。

**この例のように**

海東グループは内外の問題に直面していると言われ、同社の退役軍人はXHD夫婦だけが残した。明らかに、長年苦労しているビジネスマンとして、XHDはじっと座っていません。
ある日、一生懸命考えて問題を解決しようとしたとき、突然家宝を思いつきました。会社が設立されたとき、父は彼に贈り物として贈りました。徐父はそれが最後の手段ではないと説明しました。「一番必要な時じゃないか」考えながらXHDはこの保存状態の良いキットを見つけて開封しました「杭州市北麓の千年洞に宝があります」という文しかありませんでした。
何も言わずに、XHDは大きなポケットを手にして出発しました。彼はこの千人の洞窟を知っていました。幼い頃、父親は彼をこの隠れた交差点に連れて行き、これは千人の洞窟だと言いました。彼は父親の言葉の意味を理解しただけです。
印象にもかかわらず、XHDはこの異常に隠された穴を見つけるために多くのエネルギーを費やし、中に入ってほとんど驚かされました、それは本当に眩しかったです!しかし、赤ちゃんの種類はたくさんありますが、赤ちゃんの種類ごとの量はそれほど多くなく、もちろん、赤ちゃんごとの単価の値段も異なります。赤ちゃん?(赤ちゃんが分割できると仮定すると、分割後の値は対応する体積に比例します)

入力
入力には複数のテストインスタンスが含まれています。各インスタンスの最初の行は2つの整数vとn(v、n <100)で、それぞれポケットの容量と赤ちゃんのタイプを示します。次のn行にはそれぞれ2つの整数が含まれますpiとmi(0 <pi、mi <10)はそれぞれ、特定の赤ちゃんの単価と対応する数量を表し、vが0のときに入力が終了します。

出力
各テストケースについては、出力は、ベビーXHD値の最大数は、出力の各インスタンスに対して1つの行を検索することができます。

サンプル入力
2 2
3 1
2 3
0

出力例
5

#include<iostream>
#include<algorithm>
using namespace std;
struct node {//物品结构体
	int pi;
	int mi;
}arr[110];
bool cmp(node a, node b) {
	return a.pi > b.pi;
}
int main() {
	int v, n;
	while (cin >> v) {
		if (v == 0)break;//结束输入
		else {
			cin >> n;
			for (int i = 0; i < n; i++) {
				cin >> arr[i].pi >> arr[i].mi;
			}int sum = 0;
			sort(arr, arr + n, cmp);//保证下面每一步都是最优解
			for (int i = 0; i < n; i++) {
				if (v > arr[i].mi) {//可以完全装下目前的商品
					sum = sum + arr[i].mi*arr[i].pi;
					v = v - arr[i].mi;
				}
				else {//这个物品需要分割
					sum = sum + arr[i].pi*v;
					break;//已经装满
				}
			}
			cout << sum << endl;
		}
	}
	return 0;
}

タイトルリンク

ばらばらの間隔を選択する

数直線上にn個の間隔が開いています。開始点はaiで、終了点はbiです。複数の間隔を選択して、選択した間隔に共通の点がないようにしてください。

最初に、2つの間隔nとmがあると仮定します。これら2つの間隔の場合、
n __________________
m _________
mは完全にnの内側にあります。このとき、間隔を選択できるだけでなく、保存することもできるので、mを選択するのが明らかです。 nmフリー間隔。

a 1 ___

b ____________…c ___________
この時点で
、間隔aと間隔bが交差しない場合は、間隔aを選択するのが賢明です。間隔aと間隔bが交差する場合でも、間隔aを選択するのが賢明です。
区間aの1より前の部分は影響を与えないため、1より大きい部分のみが後続の選択に影響を与え、この影響力のある部分はbよりも大幅に小さくなります。したがって、次を選択します。

例の質問
この夏はACではありませんHDU-2037
「この夏はACではありませんか?」
「はい」
「それで、あなたは何をしていますか」
「ワールドカップを見て、ばか!」
「@#$%^&*%…」

確かに、ワールドカップが近づいており、ファンフェスティバルも近づいています。多くのACMerもコンピューターを放棄してテレビに走ると推定されています。
ファンとしては、できる限り多くの完全なゲームを見たいと思うはずです。もちろん、新時代の良き若者として、ニュース放送(全国のイベントを気にすることはありません)、非常に6 + 7、スーパーなど、他のいくつかの番組を間違いなく見ます。視聴したいテレビ番組の放送スケジュールをすべて知っていると仮定して、女の子、王小夜の「ハッピーディクショナリー」など、合理的な手配をしますか?(目標は、できるだけ多くの完全なプログラムを監視することです。)
入力
データには複数のテストインスタンスが含まれます。各テストインスタンスの最初の行には、監視するプログラムの総数を示す整数n(n <= 100)のみがあります。 n行のデータ。各行には2つのデータTi_s、Ti_e(1 <= i <= n)が含まれ、それぞれi番目のプログラムの開始時間と終了時間を表します。問題を簡単にするために、各時間は正の整数で表されます。n = 0は、入力が終了し、処理が行われないことを意味します。
出力
テストインスタンスごとに、完全に表示できるテレビ番組の数を出力します。各テストインスタンスの出力は1行を占めます。
入力例
12
1 3
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
5 10
4 14
2 9
0
出力例
5
トピックリンク

#include<iostream>
#include<algorithm>
using namespace std;
struct node{//节目
	int sx, ex;
}arr[110];
bool cmp(node a, node b) {
	return a.ex < b.ex;
}
int main() {
	int n;
	while (cin >> n) {
		if (n == 0)break;
		else {
			for (int i = 0; i < n; i++) {
				cin >> arr[i].sx >> arr[i].ex;
			}sort(arr, arr + n, cmp);//对结束时间进行排序
			int count = 1;//需要输出的答案
			int cur = arr[0].ex;//用来连接
			for (int j = 1; j < n; j++) {//第j个可不可以选择
				if (arr[j].sx >= cur) {//第j个可以选择
					cur = arr[j].ex;//更新
					count++;
				}
			}cout << count << endl;
		}
	}
	return 0;
}

ハフマンコーディング

問題の説明
  ハフマンツリーには、コーディングにおける幅広い用途があります。ここでは、ハフマンツリーの構築プロセスのみを扱います。
  数値のリスト{pi} = {p0、p1、…、pn-1}が与えられた場合、この数値のリストを使用してハフマンツリーを構築するプロセスは次のとおりです
  。1. {pi}で2つの最小の数値を見つけ、paとpbに設定します。 {pi}からpaとpbを削除し、それらの合計を{pi}に追加します。このプロセスのコストは、pa + pbとして記録されます。
  2. {pi}の数が1つだけになるまで、手順1を繰り返します。
  上記の操作プロセスでは、すべてのコストが加算され、ハフマンツリーを構築するための総コストが取得されます。
  この問題のタスク:特定のシーケンスについて、そのシーケンスでハフマンツリーを構築するための総コストを見つけてください。

たとえば、シーケンス{pi} = {5、3、8、2、9}の場合、ハフマンツリーの構築プロセスは次のようになります
  。1. {5、3、8、2、9} の最小の2つの数値を見つけます。 2と3、それらを{pi}から削除し、5を追加して{5、8、9、5}を取得します。コストは5です。
  2. {5、8、9、5}、5、5の最小の2つの数値を見つけ、{pi}から削除し、10を追加して{8、9、10}を取得します。コストは10です。 。
  3. {8、9、10}の最小の2つの数値(8と9)を見つけ、それらを{pi}から削除し、17を追加して{10、17}を取得します。コストは17です。
  4. {10、17}の中で最も小さい2つの数値(10と17)を見つけ、{pi}から削除し、27を追加して{27}を取得します。コストは27です。
  5.これで、シーケンスに残っている数は27だけです。構築プロセスは終了し、総コストは5 + 10 + 17 + 27 = 59になります。
入力フォーマット入力
  の最初の行には、正の整数n(n <= 100)が含まれています。
  次に、p0、p1、…、pn-1を表すn個の正の整数があり、各数値は1000を超えません。
出力形式
  これらの数値を使用してハフマンツリーを構築するための総コストを出力します。
サンプル入力
5
5 3 8 2 9
サンプル出力
59

#include<iostream>
#include<queue>
using namespace std;
int main() {
	priority_queue<int, vector<int>, greater<int > >q;//定义一个优先队列
	int n, s;
	cin >> n;
	while (n--) {
		cin >> s;
		q.push(s);
	}
	int a, b;
	int ans = 0;
	while(q.size()!=1){
		a = q.top();
		q.pop();
		b = q.top();
		q.pop();
		q.push(a + b);
		ans += a + b;
	}
	cout << ans<< endl;
	return 0;
}

…終わりました...

オリジナルの記事を公開した ・いい ね!0 訪問7

おすすめ

転載: blog.csdn.net/weixin_44605812/article/details/105632588