吼吼,趁机秀一秀我的小捷
INPUT FORMAT:
(file cowcycle.in)
第一行是 F 和 R,表示前齿轮和后齿轮的数量。
第二行包括 4 个数字:F1,F2(25 <= F1 < F2 <= 80),R1,R2(5 <= R1 < R2 <= 40)。从 F1 到 F2 型号的前齿轮都是可用的;从 R1 到 R2 型号的后齿轮都是可用的。至少会有一组合法的解。
题目要求:
找出符合下面的标准:
- 前面齿轮的型号(齿的数量)必须在给定的范围内。
- 后面齿轮的型号(齿的数量)必须在给定的范围内。
- 在每一种齿轮组合中,传动比率就是前面齿轮的齿数除以后面齿轮的齿数所得的商。
- 最大的传动比率至少是最小的三倍。
- 齿轮组合的转动比率(已排好序)相邻两项的差的的方差(见下面的例子) 应该达到最小。
计算并确定最佳齿轮组合(其中 F 个前齿轮,R 个后齿轮),使方差最小(传动比率至少是 3x)。
题解:直接搜索所有可能的组合找出符合和条件并方差最小那个组合,我开始一直不敢写觉得直接爆搜会超时,但实在没有想到别的什么办法了只好硬着头皮爆搜,没想到异常顺利的一A了。这道题给的数据不是很强,所以放心爆搜吧。
下面是代码:
#include<cstdio>
#include<algorithm>
using namespace std;
FILE *in,*out;
int total,f,r,fs,fe,rs,re,farr[50],rarr[50],ansf[50],ansr[50];
double ratio[1000],var;
void combf(int s,int e,int index);
void combr(int s,int e,int index);
void check(void);
int main()
{
in=fopen("cowcycle.in","r");
out=fopen("cowcycle.out","w");
fscanf(in,"%d%d",&f,&r);
fscanf(in,"%d%d%d%d",&fs,&fe,&rs,&re);
total=f*r;
var=100000000;
combf(fs,fe,0);
for(int i=0;i<f-1;i++) fprintf(out,"%d ",ansf[i]);
fprintf(out,"%d\n",ansf[f-1]);
for(int i=0;i<r-1;i++) fprintf(out,"%d ",ansr[i]);
fprintf(out,"%d\n",ansr[r-1]);
fclose(in);
fclose(out);
return 0;
}
void combf(int s,int e,int index)
{
if(index==f)
{
combr(rs,re,0);
return ;
}
if(s>e) return ;
for(int i=s;i<=e;i++)
{
farr[index]=i;
combf(i+1,e,index+1);
}
}
void combr(int s,int e,int index)
{
if(index==r)
{
int fmax=farr[f-1];
int fmin=farr[0];
int rmax=rarr[r-1];
int rmin=rarr[0];
if((fmax*rmax)/(rmin*fmin)<3) return ;//唯一的一个剪枝
check();
return ;
}
if(s>e) return ;
for(int i=s;i<=e;i++)
{
rarr[index]=i;
combr(i+1,e,index+1);
}
}
void check(void)
{
for(int i=0;i<f;i++)
{
for(int j=0;j<r;j++) ratio[i*r+j]=(double)farr[i]/rarr[j];
}
sort(ratio,ratio+total);
for(int i=0;i<total-1;i++) ratio[i]=ratio[i+1]-ratio[i];
double mean=0;
for(int i=0;i<total-1;i++) mean+=ratio[i];
mean/=(total-1);
double tv=0;
for(int i=0;i<total-1;i++)
{
double diff = ratio[i]-mean;
tv+=diff*diff;
}
tv/=(total-1);
if(tv<var)
{
var=tv;
for(int i=0;i<f;i++) ansf[i]=farr[i];
for(int i=0;i<r;i++) ansr[i]=rarr[i];
}
}