XTU2012 湘潭邀请赛 Interview Arrangement ~ 离散化+01背包

来源:互联网 发布:软件招标书范本 编辑:程序博客网 时间:2024/06/05 03:56

Interview Arrangement

先将时间离散化,然后按结束时间排序,最后按时间DP。


 

ACcode:

#include<iostream>#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;__int64 max(__int64 a,__int64 b){    return a>b?a:b;}struct Edge{    __int64 s,e,w;};bool cmp(__int64 *a,__int64 *b){    return *a<*b;}bool cmpedge(Edge a,Edge b){    return a.e<b.e;}Edge edge[100010];__int64 *p[200020];__int64 dp[200020];int vis[200020];int main(){    // freopen("1455.in", "r", stdin);    // freopen("out.txt", "w", stdout);    int n,top,i,j;    while(~scanf("%d",&n))    {        for(top=0,i=1; i<=n; i++)        {            scanf("%I64d %I64d %I64d",&edge[i].s,&edge[i].e,&edge[i].w);            p[top++] = &edge[i].s;            p[top++] = &edge[i].e;        }        sort(p,p+top,cmp);        int ii = 0;        for(i=0; i<top; i++)        {            if(i<top-1&&*p[i]==*p[i+1])            {                *p[i]=ii;                continue;            }            *p[i] = ii;            ii++;        }        sort(edge+1,edge+n+1,cmpedge);        memset(dp,0,sizeof(dp));        memset(vis,0,sizeof(vis));        __int64 Max = 0;        vis[0]=1;        for(i = 1; i<=n; i++)        {            j = edge[i].s;            while(!vis[j]) j--;            dp[edge[i].e] = max(dp[j]+edge[i].w,Max);            vis[edge[i].e] = 1;            Max = max(dp[edge[i].e],Max);        }        printf("%I64d\n",Max);    }}


原创粉丝点击