usaco 4.2 Cowcycles

来源:互联网 发布:怎么看淘宝店铺保证金 编辑:程序博客网 时间:2024/06/01 07:43

 搜索题目,只需要两个优化即可,其他的效果并不明显
1)因为递归搜索出的数列是有序的,所以将分子升序,分母降序排列后,再按顺序相除,得到的数列将“较为有序”,采用插入排

序比较好,因为c++的sort函数在数组小的时候会自动insert_sort(),所以还是可以用sort的。这个优化是这道题目的关键!
2)计算方差可以采用 D(x) = E(x*x) - E(x)*E(x)

这道题目花了很长时间,总结如下:
1)对于搜索最终更新答案的函数要尽量优化,对较为有序的数列排序,速度很快
2)当遇到像编译器错误的问题时,一般是数组大小没开够,或者开错了,这次就是把ans[2][N]写成了ans[N][2]导致错误

 

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <map>
  4. #include <vector>
  5. using namespace std;
  6. /*
  7. PROG: cowcycle
  8. LANG: C++
  9. ID: heben991
  10. */
  11. const int N = 60;
  12. int f[N], r[N], F, R, f1, f2, r1, r2;
  13. int ans[2][N];
  14. double a[N], mini=1e15;
  15. void update()
  16. {
  17.     double mean=0, vari=0, t;
  18.     int i, j, k=0, p;
  19.     for(i = 1; i <= F; ++i)
  20.     for(j = R; j >= 1; --j)
  21.     {
  22.         t = (double)f[i]/r[j];
  23.         a[++k] = t;
  24.     }
  25.     sort(a+1,a+k+1);
  26.     --k;
  27.     for(i = 1; i <= k; ++i)
  28.     {
  29.         a[i]=a[i+1]-a[i];
  30.         mean += a[i];
  31.         vari += a[i]*a[i];
  32.     }
  33.     mean /= k;
  34.     vari = vari/k - mean*mean;
  35.     if(vari < mini)
  36.     {
  37.         mini = vari;
  38.         memcpy(ans[0], f+1, F*sizeof(int));
  39.         memcpy(ans[1], r+1, R*sizeof(int));
  40.     }
  41. }
  42. void dfs_rear(int k, int low)
  43. {
  44.     if(k > R)
  45.     {
  46.         int i, j;
  47.         if( f[F]*r[R] < 3*f[1]*r[1] ) return;
  48.         update();
  49.     }
  50.     else
  51.     {
  52.         for(r[k] = low; r[k]-R+k <= r2; ++r[k])
  53.         {
  54.             dfs_rear(k+1,r[k]+1);
  55.         }
  56.     }
  57. }
  58. void dfs_front(int k, int low)
  59. {
  60.     if(k > F)
  61.     {
  62.         dfs_rear(1, r1);
  63.     }
  64.     else
  65.     {
  66.         for(f[k] = low; f[k]-F+k <= f2; ++f[k])
  67.         {
  68.             dfs_front(k+1, f[k]+1);
  69.         }
  70.     }
  71. }
  72. int main()
  73. {
  74.     int i, j, k, t, h;
  75.     freopen("cowcycle.in""r", stdin);
  76.     freopen("cowcycle.out","w",stdout);
  77.     scanf("%d%d%d%d%d%d", &F,&R,&f1,&f2,&r1,&r2);
  78.     dfs_front(1, f1);
  79.     printf("%d", ans[0][0]);
  80.     for(i = 1; i < F; ++i) printf(" %d", ans[0][i]);
  81.     puts("");
  82.     printf("%d", ans[1][0]);
  83.     for(i = 1; i < R; ++i) printf(" %d", ans[1][i]);
  84.     puts("");
  85.     return 0;
  86. }