贪心算法
先按照profit从大到小排序
然后从大到小取值尽量使得较大的值放到数组中,如果位置n已经放上了货物则把当前的货物往前放,最终放到空的位置上。
代码如下:
#include <cstdio>
#include <cstdlib>
#include <cstring>
typedef struct {
int p, d;
}node;
node a[10010];
bool vis[10010];
int comp(const void *sa, const void *sb)
{
node *aa = (node*)sa, *bb = (node*)sb;
return bb->p-aa->p;
}
int main ()
{
int n, ans;
while(scanf("%d",&n)==1)
{
memset(vis,0,sizeof(vis));
for(int i = 0; i < n; i++) {scanf("%d %d",&a[i].p,&a[i].d);}
qsort(a,n,sizeof(a[0]),comp);
ans = 0;
for(int i = 0; i < n; i++)
{
int c = a[i].d;
if(vis[c]==0) { ans+=a[i].p; vis[c] = 1;}
else
{
for(c = a[i].d-1; c>=1; c--)
if(vis[c]==0)
{
ans+=a[i].p;
vis[c] = 1;
break;
}
}
}
printf("%d\n",ans);
}
return 0;
}