1. 程式人生 > 其它 >演算法__貪心__活動安排問題

演算法__貪心__活動安排問題

  • 考慮將一系列活動安排在科學會堂。假設有n個活動,每個活動需要花費一個單位時間。如果在時間T[i]或T[i]之前開始,則活動i將提供P[i]元的利潤,其中T[i]是任意的數字。如果一個活動不是在T[i]或T[i]之前開始的,那麼在安排過程中它根本不會帶來任何利潤。如果所有事件都可以在0時刻開始。
  • 輸入:n個活動的T[i]和P[i]
  • 輸出:活動安排順序和獲得的利潤。
  • 解:
    #include<stdio.h>
    typedef struct
    {
        int T;
        int P;
        int flag;
    }LNode;
    //倒著安排活動使損失最小,如果剛好有活動截止就安排它,不然安排其他受益最大的活動,若都過期了就安排損失最小的活動。 
    int main() { LNode A[20]; int X[20]; int n,i,j,k; int sum=0; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d %d",&A[i].T,&A[i].P); A[i].flag=0; } for(i=n;i>=1;i--) { int isover=1,isok=0; int mini,maxi,min,max; max
    =-1,min=10000; for(j=1;j<=n;j++) { if(A[j].flag==0&&A[j].T==i)//如果剛好有個活動截止,就直接安排 { X[i]=j; sum+=A[j].P; A[j].flag=1; isover=0; break; } if(A[j].flag==0&&A[j].T<i)//
    過期的活動 { if(A[j].P<min) { mini=j; min=A[j].P; } } if(A[j].flag==0&&A[j].T>=i)//沒過期的活動 { if(A[j].P>max) { maxi=j; max=A[j].P; isok=1; } } } if(isover==0) continue; if(isok==1) { X[i]=maxi; sum+=A[maxi].P; A[maxi].flag=1; } else { X[i]=mini; A[mini].flag=1; } } printf("%d: ",sum); for(i=1;i<=n;i++) { printf("%d ",X[i]); } return 0; }