#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; }
原文:https://www.cnblogs.com/hiyori/p/14901073.html