记录编号 249321 评测结果 AAAAAAAAAA
题目名称 [SDOI 2016 Round1] 征途 最终得分 100
用户昵称 Gravatar/k 是否通过 通过
代码语言 C++ 运行时间 1.385 s
提交时间 2016-04-12 15:48:02 内存使用 69.46 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. using namespace std;
  5. typedef long long ll;
  6. double f[3010][3010];
  7. double s[3010],xb;
  8. int n,m;
  9. inline double sqr(double x)
  10. {
  11. return x*x;
  12. }
  13. void g(double *F,double *H,int z,int y,int l,int r)
  14. {
  15. if(z>y)
  16. return;
  17. int mid=(z+y)>>1;
  18. int mmid=z;
  19. //if(z==1&&y==2)
  20. // printf("P%d\n",H[0]);
  21. for(int i=l;i<mid;i++)
  22. if(F[mid]>H[i]+sqr(s[mid]-s[i]-xb))
  23. {
  24. //printf("%d\n",s[mid]);
  25. F[mid]=H[i]+sqr(s[mid]-s[i]-xb);
  26. mmid=i;
  27. }
  28. g(F,H,z,mid-1,l,mmid);
  29. g(F,H,mid+1,y,mmid,r);
  30. }
  31. int main()
  32. {
  33. freopen("menci_journey.in","r",stdin);
  34. freopen("menci_journey.out","w",stdout);
  35. scanf("%d%d",&n,&m);
  36. for(int i=1;i<=n;i++)
  37. scanf("%lf",&s[i]);
  38. //printf("G");
  39. for(int i=1;i<=n;i++)
  40. s[i]+=s[i-1];
  41. memset(f,127,sizeof(f));
  42. //printf("%lf\n",f[0][0]);
  43. /*double XB=s[n]/m;
  44. printf("%lf\n",XB);*/
  45. xb=s[n]/(double)m;
  46. //printf("%lld\n",xb);
  47. f[0][0]=0.0;
  48. for(int i=1;i<=m;i++)
  49. g(f[i],f[i-1],1,n,0,n);
  50. //g(f[i],f[i-1],1,min(i,m),0,min(i-1,m));
  51. //printf("%lld\n",f[2][1]);
  52. //printf("%d\n",f[n][1]);
  53. /*for(int i=1;i<=n;i++)
  54. {
  55. for(int j=1;j<=i;++j)
  56. {
  57. int p=-1;
  58. for(int k=0;k<i;k++)
  59. if(f[i][j]>f[k][j-1]+sqr(s[i]-s[k]-xb))
  60. {
  61. f[i][j]=f[k][j-1]+sqr(s[i]-s[k]-xb);
  62. p=k;
  63. }
  64. //printf("%d\n",p);
  65. }
  66. //printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
  67. }*/
  68. //printf("%lld\n",f[n][1]);
  69. //printf("%lf\n",f[n][m]);
  70. f[m][n]/=(double)m;
  71. f[m][n]*=sqr((double)m);
  72. // printf("%lld\n",f[n][m]);
  73. // double p=(double)f[n][m]/(double)m;//*(double)m*(double)m;
  74. printf("%.lf",f[m][n]);
  75. /*f[n][m]*=m*m;
  76. getchar();
  77. getchar();*/
  78. }