poj 3553 Task schedule
贪心,按dj从小到大排序,并按次顺序加工。
因为对于最小的那个dj是不变的,那么如果先加工其他的,那么cj就会增大,从而cj - dj就会增大,所以要先加工dj小的。
#include <iostream> #include<vector> #include<stdio.h> #include<cstring> #include<algorithm> using namespace std; vector<int>a[50005]; struct thing{ int p,d; int id; }t[50005]; int n; int visit[50005]; //该id是否被访问过 int cmp(const void * a,const void * b){ return (*(thing *)a).d-(*(thing *)b).d; } void dfs(int cur){ if(visit[cur]) return; visit[cur]=1; int len=a[cur].size(); for(int i=0;i<len;i++) dfs(a[cur][i]); printf("%d\n",cur); } void init(){ for(int i=1;i<=n;i++) a[i].clear(); } int main() { scanf("%d",&n); init(); memset(visit,0,sizeof(visit)); for(int i=1;i<=n;i++){ scanf("%d %d",&t[i].p,&t[i].d); t[i].id=i; } qsort(t+1,n,sizeof(thing),cmp); int m; scanf("%d",&m); while(m--){ int temp1,temp2; scanf("%d %d",&temp1,&temp2); a[temp2].push_back(temp1); //a数组存做a之前一步要做的事情 } for(int i=1;i<=n;i++){ while(!visit[t[i].id]) dfs(t[i].id); } return 0; }