poj1456(两种做法)

来源:互联网 发布:java跳出foreach循环 编辑:程序博客网 时间:2024/05/05 06:07

带时限的作业排序~~

#include <iostream>#include <algorithm>#include <cstdio>#include <cstring> using namespace std; struct node {     int p;     int t; }; node a[10005]; int visit[10005];int cmp(node c,node d)//按照收益从大到小,相同收益则时间后的在前{   if (c.p==d.p)        return c.t>d.t;   else    return c.p>d.p;}  int main()  {      int i,j,n,end,max,sum;      while(scanf("%d",&n)==1)      {          sum=0;          memset(a,0,sizeof(a));          memset(visit,0,sizeof(visit));          for (i=0;i<n;i++)          scanf("%d%d",&a[i].p,&a[i].t);          sort(a,a+n,cmp);          for (i=0;i<n;i++)          {              if (!visit[a[i].t])              {                  sum=sum+a[i].p;                  visit[a[i].t]=1;              }              else              {                  for (j=a[i].t-1;j>=1;j--)//因为这边是截止时间,所以注意是1                  {                      if (!visit[j])                      {                          visit[j]=1;                          sum=sum+a[i].p;                          break;                      }                  }              }          }          printf("%d\n",sum);      }      return 0;  }

并查集做法

#include <iostream>#include <algorithm>#include <cstring>#include <cstdio> using namespace std; struct node {     int p;     int t; }; int cmp(node c,node d) {    if (c.p==d.p)     return c.t>d.t;   else     return c.p>d.p; } int pre[10005]; node a[10005]; int find(int i) {     int j=i,temp;     while(pre[i]!=i)     i=pre[i];     while(j!=i)     {         temp=pre[j];         pre[j]=i;         j=temp;     }     return i;}int main() {     int i,j,n,sum,q;     while(scanf("%d",&n)==1)     {         sum=0;         memset(pre,0,sizeof(pre));         for (i=0;i<n;i++)            scanf("%d%d",&a[i].p,&a[i].t);          sort(a,a+n,cmp);         for (i=1;i<=10005;i++)            pre[i]=i;         for (i=0;i<n;i++)         {            q=find(a[i].t);            if (q>0)         {             pre[q]=q-1;             sum=sum+a[i].p;         }         }          printf("%d\n",sum);     }     return 0; }


0 0
原创粉丝点击