貪欲アルゴリズム思考概要(レンガのHDU 2088ボックス) - アルゴリズムの設計と解析「魏ちょっと言いました」

引用ディレクトリ:

まず、貪欲アルゴリズムの基本的な考え方と個人的理解

第二に、車両の給油問題の貪欲な性質を選択

第三に、貪欲アルゴリズム貪欲な思考問題コーチング昇華

四、ペアプログラミングの状況

 

 

まず、貪欲アルゴリズムと基本的な考え方の個人的な理解

  1.1基本的な概念:

  まず、慎重に名前が示すように、貪欲アルゴリズムは常に現在のビューに最良の選択をするどのような教科書から貪欲の基本的な考え方、お読みください。その貪欲アルゴリズムは、ちょうどそれがローカルの最適な選択ではいくつかの意味をなさ選択し、全体的な最善を考慮していません。もちろん、私たちは、貪欲アルゴリズムの最終結果は、全体的に最高であると思います。貪欲アルゴリズムは、すべての問題に対する最善のソリューション全体あったが、問題の多くいることはできませんが、それは全体の最適なソリューションを生成します。単一始点最短経路問題、最小スパニングツリーの問題。いくつかのケースでは、貪欲アルゴリズムは、最適な全体的な解を得ることができない場合でも、最終的な結果は、最適解の良い近似です。

  だから、貪欲アルゴリズムのために、アルゴリズムは局所最適とグローバル最適なソリューションを一貫であることが判明したとき、あなたは貪欲なアルゴリズムを使用することができ、何の固定テンプレートなどのルーチンではありません。

 

  使用の1.2条件:

  (1)貪欲選択された特性を有する必要があります

  いわゆる貪欲な性質は、最適なソリューションを求めて、全体的な問題の選択は貪欲な選択を達成するために、部分的に、一連の最良の選択、すなわち、あり得ることを意味しています。これは、主な違いは、貪欲アルゴリズムと動的プログラミングアルゴリズムである、貪欲アルゴリズム可能最初の必須要素です。

  ボトムアップ方式のソリューション通常、動的計画アルゴリズムの各サブ質問、貪欲アルゴリズムは、連続貪欲を選択するために、反復的に、通常、トップダウン方式で、貪欲な選択は、各によって、問題を単純化する需要を行いますこれは、より小さなサブ問題の大きさです。

  特定の問題については、それが全体の最適なソリューションにつながり、最終的に作られたすべてのステップを証明しなければならない選択的な性質貪欲、貪欲な選択肢を持っているかどうかを判断します。

  (2)は、最適な構造特性を有する必要があります

  最適なソリューションは、彼の息子の問題の問題に対する最適解が含まれている場合、この問題は構造的な次善を持っているという。問題の最適な基礎構造の性質は、問題は、動的プログラミングアルゴリズムや貪欲アルゴリズムの重要な特徴であるということです。

  1.3使用のアイデア:

  貪欲アルゴリズムは、特定の初期値問題から始まって、より良いソリューションを実現するためにできるだけ速く、近くに与えられた特定のターゲットに維持されます。前方に移動し続けることができないアルゴリズムにおける特定のステップに達すると、アルゴリズムは停止します。しかし、貪欲アルゴリズムは、最終的な解決策が最善であり、唯一の特定の制約を解決するための実行可能解の範囲を満たすために、問題の最大または最小のソリューションを解決できないことを保証することはできません。

 

  問題1.4貪欲アルゴリズムのクラシック種類:

(1)ナップザック問題

質問(2)活動のタイミング

(3)ラインカバレッジの問題

(4)デジタル問題の組み合わせ

(5)最大の整数問題

(6)カード発行を共有します

(7)変更の問題を探して

 

 

第二に、車両燃料補給の選択問題の貪欲な性質

  PTA7-1車給油問題:移動し、給油後、現在の変数の燃料をリセットし、変数ANSマークの付いた周波数を高め、この方法で上に移動することができ、燃料の完全な車を探している最大のガソリンスタンドの最後の旅、特別な注意は、より多くの燃料の完全な短い車よりも、すべての散歩から最大限のサポートの時間かどうかを確認する必要があることです。

 

 

第三に、貪欲アルゴリズムの問題コーチング昇華貪欲な思考

  トピック2.1出典:

    HDUます。http:?//acm.hdu.edu.cn/showproblem.php PID = 2088

 

  2.2カジュアルワーキングタイトル:

  レンガの箱

・問題の説明:

  リトルボブはレンガの彼の箱で遊んで好きです。彼はレンガ別の時に1を置き、異なる高さのスタックを構築します。「ルックは、私は壁を構築してきました!」と、彼は彼の姉のアリスに伝えます。「いや、あなたはすべてのスタックを同じ高さを確認する必要があります。そして、あなたは本当の壁を持っているでしょう。」と、彼女は反論します。ほとんど考慮した後、ボブは彼女が右であることを見ています。そこで彼は、すべてのスタックが、その後同じ高さになるように、レンガ、一つ一つを、再配置する設定しています。ボブは怠惰であるので、しかし、彼は移動レンガの最小数でこれをやりたいです。手伝ってくれますか?

 

 

 

・入力

  The input consists of several data sets. Each set begins with a line containing the number n of stacks Bob has built. The next line contains n numbers, the heights hi of the n stacks. You may assume 1≤n≤50 and 1≤hi≤100.
  The total number of bricks will be divisible by the number of stacks. Thus, it is always possible to rearrange the bricks such that all stacks have the same height.
  The input is terminated by a set starting with n = 0. This set should not be processed.
 
·Output
  For each set, print the minimum number of bricks that have to be moved in order to make all the stacks the same height.
  Output a blank line between each set.
 
·Sample Input
  6
  5 2 4 1 7 5
  0
 
·Sample Output
  5

 

   2.3  题目大意:

    题目意思是:给定一堆积木,并且分成k列,试问如何用最少的移动操作(只能移动到相邻位置),能够将k列堆积木达到平均高度。

 

  2.4  题目思路:

    本题的贪心性质选择为:计算出总共的砖块数,在求出N堆砖的平均高度(即需要达到的最终高度),把高的堆上的砖移到不足平均高度的堆上。应该计算出所有不足高度的堆上总共差多少砖达到高度,即为结果。

 

  2.5  题目AC代码:

#include<stdio.h>
#include<string.h>

int main()
{
    int N;
    int a[55];
    int kase = 1;
    while(scanf("%d",&N) && N)
    {
        int sum = 0;
        for(int i = 0; i < N; i++)
        {
            scanf("%d",&a[i]);
            sum += a[i];
        }
        int ans = 0;
        for(int i = 0; i < N; i++)
        {
            if(a[i] < sum/N)
                ans += sum/N - a[i];
        }
        printf("Set #%d\n",kase++);
        printf("The minimum number of moves is %d.\n\n",ans);
    }

    return 0;
}

 

四、 结对编程情况:

  经过前几次实践题合作之后,结对编程逐渐顺利,能够让双方都能不断进行思路碰撞,实现较为合适的算法,当和三木小哥哥想到一起完成了算法设计、完成代码书写、成功AC一题之后,会有较为愉悦的心情感,较为顺利的完成三道题,继续加油,暂无较大问题。

 

 

如有不合理的地方,请及时指正,我愿听取改正~

参考链接:https://oi-wiki.org/

おすすめ

転載: www.cnblogs.com/WinniyGD/p/11889634.html