codeforce 1256e DP

在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
#include <algorithm>
#include <utility>
#define ll long long
#define x first
#define y second 
using namespace std;
pair<ll ,int>a[200010];
ll dp[200010];
int ans[200010],num[200010];
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)scanf("%lld",&a[i].x),a[i].y=i,dp[i]=1e18;      //一定要从零开始
	dp[0]=0,dp[n]=1e18;
	sort(a,a+n);         //sort按照pair第一维排序
	for(int i=0;i<n;i++)
		for(int j=3;j<=5&&i+j<=n;j++)
		{
			int diff=a[i+j-1].x-a[i].x;
			if(dp[i+j]>dp[i]+diff)
				dp[i+j]=dp[i]+diff,num[i+j]=j;          //num储存这个点的长度
		}
	int k=n;          //从后开始枚举
	int cnt=0;
	while(k)
	{
		cnt++;
		for(int j=1;j<=num[k];j++)ans[a[k-j].y]=cnt;    //a【k-j】.y是位置
		k-=num[k];          //每次减去这个num[k],
	}
	printf("%lld %d\n",dp[n],cnt);
	for(int i=0;i<n;i++)printf("%d ",ans[i]);
}
发布了88 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44879687/article/details/102925312