带时限的作业排序~~
#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;
}