BZOJ

Luogu

sol

如果已经确定了一个序列,现要求把这个序列分成m个连续段作为答案,那么就可以用一个显而易见的DP

DP显然可以得到当前序列下的最优解。

所以模拟退火瞎JB改一改序列每次DP一下就可以了

据说这题random_shuffle可以AC

code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<ctime>
using namespace std;
int n,m,a[25];double s[25],dp[25][10],sum,ans=1e50;
double sqr(double x){return x*x;}
double getdp()
{
for (int i=1;i<=n;++i) s[i]=s[i-1]+a[i];
memset(dp,127,sizeof(dp));
dp[0][0]=0;
for (int i=1;i<=n;++i)
for (int j=1;j<=m;j++)
for (int k=0;k<i;k++)
dp[i][j]=min(dp[i][j],dp[k][j-1]+sqr(s[i]-s[k]-sum));
ans=min(ans,dp[n][m]);
return dp[n][m];
}
double Rand(){return rand()%100000/100000.00;}
void SA(double T)
{
double now=ans,nw;
int x,y;
while (T>1e-3)
{
int x=1+rand()%n,y=1+rand()%n;
if (x==y) continue;
swap(a[x],a[y]);
nw=getdp();
if (nw<now||exp((now-nw)/T)>Rand()) now=nw;
else swap(a[x],a[y]);
T*=0.99;
}
}
int main()
{
srand(141905+141936);
scanf("%d %d",&n,&m);
for (int i=1;i<=n;++i) scanf("%d",&a[i]),sum+=a[i];
sum/=m;
getdp();
SA(1000);
printf("%.2lf\n",sqrt(ans/m));
return 0;
}

最新文章

  1. jsp按钮隐藏自动点击
  2. iOS 隐藏/去掉 导航栏返回按钮中的文字
  3. 1.js基础
  4. 词法分析器--DFA(c++实现)
  5. ylbtech-dbs:ylbtech-5,RI(报销发票系统)
  6. C#中判断字符串中包含某个字符
  7. 重构3-Pull Up Method(方法上移)
  8. C++ sizeof
  9. 【jquery插件】-网页下雪效果
  10. 隐马尔科夫模型(HMM)及事实上现
  11. Quartz 代码调用Demo
  12. 【续】5年后,我们为什么要从 Entity Framework 转到 Dapper 工具?
  13. Spring MVC 使用介绍(十五)数据验证 (二)依赖注入与方法级别验证
  14. GCC __builtin_expect的作用
  15. weblogic的web.xml报错----Malformed UTF-8 char -- is an XML encoding declaration missing
  16. input:checked + label用法
  17. 基础篇|一文搞懂RNN(循环神经网络)
  18. Hadoop:HDFS NameNode内存全景
  19. Reactor/Proactor的比较 (ZZ)
  20. [C++] 用Xcode来写C++程序[1] 新建C++项目工程

热门文章

  1. &nbsp;&nbsp;&nbsp;&nbsp;My GitHub
  2. 编写一个js函数,该函数有一个n(数字类型),其返回值是一个数组,该数组内是n个随机且不重复的整数,且整数取值范围是[2,32]
  3. 合唱团 (线性dp)
  4. 【BZOJ2095】 Bridge
  5. Wordpress上传资源报HTTP错误
  6. Storm+HBase实时实践
  7. Ambari部署HDP:HBase Master启动后自动消失
  8. iBrand 产品工具包:Laravel Database Logger
  9. 网络基础Cisco路由交换一
  10. mongodb去除重复的数据(二)