题目链接 3666 -- Making the Grade (poj.org)
看 题解说的时 dp ,当时不知道该怎么 dp 。
现在看回去 想想写挺暴力的,题解的大致意思是 排序好后,假设排序好后,第 i 个为标准,计算出我们需要改的总和
我们可以转化为当标准为第 i 个数时,其他数转化为这个标准下的 价值
现在感觉还是有点蒙,
这个佬的感觉讲的有道理Making the Grade(POJ3666) - lzw4896s - 博客园 (cnblogs.com)
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
const int N=2020;
long long a[N],b[N],f[N];
int main()
{
int m;
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>a[i];
b[i]=a[i];
}
sort(b+1,b+1+m);
memset(f,0,sizeof f);
long long ans=1e18;
for(int i=1;i<=m;i++)
{
long long ls=1e18;
for(int j=1;j<=m;j++)
{
ls=min(ls,f[j]);
f[j]=abs(a[i]-b[j])+ls;//当前这个要改变的次数为之前的总和的最小值加本身
}
}
for(int i=1;i<=m;i++)
ans=min(f[i],ans);
cout<<ans;
}