贪心,按任务的损失从大到小排序,尽量加损失大的任务,以便损失小。
其中,需要用并差集来实现“快速找到下一个位置”.
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int n;
struct aa
{
int d,w;
bool operator <(const aa &b) const
{
return w>b.w;
}
}a[100005];
int fa[10005];
int find(int u)
{
return u==fa[u] ? u:fa[u]=find(fa[u]);
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&a[i].d);
for (int i=1;i<=n;i++) scanf("%d",&a[i].w);
sort(a+1,a+n+1);
for (int i=1;i<=n;i++) fa[i]=i;
int ans=0;
for (int i=1;i<=n;i++)
{
int f=find(a[i].d);
if (f==0) ans+=a[i].w;
else fa[f]=f-1;
}
printf("%d",ans);
return 0;
}总结
1:本题是并查集的经典应用——快速找到下一个位置
2:其实就是要我们保证,尽量选价值大的,并且还要保证放的位置要尽量可以让后来的能放进去,其实就是因为所有的物品都是从1开始一段区间可放,越往前的位置用处最大,所以可以放的时候尽量往后放
本文介绍了一种结合并查集与贪心策略解决特定问题的方法。通过将任务按损失值从大到小排序,并利用并查集快速确定可执行任务的位置,实现了资源的有效分配。文章提供了一个具体实例的C++实现代码。
1240

被折叠的 条评论
为什么被折叠?



