可以发现答案只与拐点有关,所以贪心就行了,最后把中间的点放进去。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=300005;
int n;
int num[N],ss[N],ans[N];
inline int read()
{
int a=0,f=1; char c=getchar();
while (c<'0'||c>'9') {if (c=='0') f=-1; c=getchar();}
while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
return a*f;
}
int main()
{
n=read();
for (int i=1;i<=n;i++) ss[i]=read();
for (int i=1;i<=n;i++) num[i]=read();
sort(num+1,num+n+1);
int l=1,r=n;
for (int i=2;i<n;i++)
{
if (ss[i]>ss[i-1]&&ss[i]>ss[i+1]) ans[i]=num[r--];
if (ss[i]<ss[i-1]&&ss[i]<ss[i+1]) ans[i]=num[l++];
}
if (ss[1]<ss[2]) ans[1]=num[l++]; else ans[1]=num[r--];
if (ss[n-1]<ss[n]) ans[n]=num[r--]; else ans[n]=num[l++];
for (int i=2;i<n;i++)
{
if (ss[i]>ss[i-1]&&ss[i]<ss[i+1]) ans[i]=num[l++];
if (ss[i]<ss[i-1]&&ss[i]>ss[i+1]) ans[i]=num[r--];
}
long long sum=0;
for (int i=1;i<n;i++) sum+=abs(ans[i]-ans[i+1]);
printf("%lld\n",sum);
for (int i=1;i<=n;i++) printf("%d ",ans[i]);
return 0;
}
贪心算法解决拐点问题
本文介绍了一种使用贪心算法解决特定拐点问题的方法。通过对输入数据进行排序,并根据序列的升序或降序特性来分配最优值,从而确保了整体序列的最短距离之和。该算法首先确定序列中的拐点,然后将最大的数分配给局部最大值的拐点处,最小的数分配给局部最小值的拐点处。
830

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



