USACO6.3.3 Cowcycles(cowcycle)

来源:互联网 发布:魔兽中机械宠物矩阵 编辑:程序博客网 时间:2024/05/16 13:42

dfs,重点在优化上,需要注意的都写到代码里了


/*ID:xsy97051LANG:C++PROG:cowcycle*/#include <iostream>#include <cstdio>#include <algorithm>using namespace std;#define MAXF 10#define MAXR 20+2int ansF[MAXF];//答案Fint ansR[MAXR];//答案Rint dfsF[MAXF];//搜索Fint dfsR[MAXR];//搜索Rdouble rate[MAXF*MAXR];//比率double diff[MAXF*MAXR];//差值int F,R,F1,F2,R1,R2,cnt;double minV;//最小方差void Update()//排序并且计算{   double tmp,sum=0,variance=0,average;    int c=0;   for(int i=0;i<F;i++)//计算比率    for(int j=0;j<R;j++)       rate[c++]=dfsF[i]*1.0/dfsR[j];    for(int i=0;i<cnt-1;i++)//插入排序    for(int j=i+1;j>0;j--)       if(rate[j-1]>rate[j])       {           tmp=rate[j-1];          rate[j-1]=rate[j];          rate[j]=tmp;       }   for(int i=0;i<cnt-1;i++)//计算差值   {      diff[i]=rate[i+1]-rate[i];      sum+=diff[i];   }   for(int i=0;i<cnt-1;i++)      variance+=diff[i]*diff[i];   average=sum/(cnt-1);   //计算方差      variance=variance-average*sum;      if(minV>variance)//更新数据   {      minV=variance;      for(int i=0;i<F;i++)         ansF[i]=dfsF[i];      for(int i=0;i<R;i++)         ansR[i]=dfsR[i];   }}void DFS_R(int r,int start){if(r==R)//最大传动至少为最少传动的3倍{  if(dfsR[0]*dfsF[0]*3<=dfsR[R-1]*dfsF[F-1])   Update();  return; } for(int i=start;i<=R2-R+r+1;i++) {  dfsR[r]=i;  DFS_R(r+1,i+1); }}void DFS_F(int f,int start){if(f==F){  DFS_R(0,R1);  return; }for(int i=start;i<=F2-F+f+1;i++) {  dfsF[f]=i;  DFS_F(f+1,i+1); }}int main(){  freopen("cowcycle.in","r",stdin);  freopen("cowcycle.out","w",stdout);  cin>>F>>R>>F1>>F2>>R1>>R2;   minV=1e10;   cnt=F*R;   DFS_F(0,F1);     for(int i=0;i<F-1;i++)    cout<<ansF[i]<<" ";   cout<<ansF[F-1]<<endl;;   for(int i=0;i<R-1;i++)    cout<<ansR[i]<<" ";   cout<<ansR[R-1]<<endl;  return 0;}


0 0