大意:
这题题意比较绕口,读懂了题目,就差不多了。干脆把中文翻译的放上来吧。
秀·谢夫(小奶牛)在花花公子杂志上中了大奖,于是她从农村搬到了城郊的一座别墅中。可是她还常常怀念乡村的生活,总想回到原来的农村逛逛。为了环保,秀决定骑上为她量身定做的奶牛自行车(特殊的自行车,专门为牛蹄设计)。
秀大约有一吨重。同样的,秀在普通的奶牛自行车上,要想骑得平平稳稳,也不是一件容易的事。因此,调节奶牛自行车的变速器让秀心力交瘁。请帮助秀选择她的奶牛自行车前面 F (1 <= F <= 5)个齿轮和后面 R (1 <= R <= 10)个齿轮,使她的 F*R 奶牛自行车符合下面的标准:
1. 前面齿轮的型号(齿的数量)必须在给定的范围内。
2. 后面齿轮的型号(齿的数量)必须在给定的范围内。
3. 在每一种齿轮组合中,传动比率就是前面齿轮的齿数除以后面齿轮的齿数所得的商。
4. 最大的传动比率至少是最小的三倍。
5. 齿轮组合(已排好序)相邻两项的差的的方差应该达到最小。
分析和实现:
问题空间不算太大,直接暴搜,有几点需要注意的:
1. 最大传动比率不小于最小传动比率的三倍,作为剪枝条件,不过避免除法,用乘法得到
2. 遍历前后齿轮可以用一个递归,不过用两个更直观些。
3. 比率的计算可以在递归过程中完成,可避免大量重复运算。
4. 给传动比排序时若用lib的qsort或STL的sort效率很低(因为元素太少),简单的直接写个比较排序比用库函数快两倍。
5. 传动比方差的计算时可避免一些浮点运算。
注意一下变量、函数命名,清晰化,一次可过。
/*
ID: blackco3
TASK: cowcycle
LANG: C++
*/
#include <iostream>
#include <memory.h>
#include <algorithm>
using namespace std;
const int _max_front_(5), _max_rear_(10), _max_pair_(_max_front_*_max_rear_) ;
int front[_max_front_], rear[_max_rear_] ;
int best_front[_max_front_], best_rear[_max_rear_];
int n_front, n_rear, min_front, max_front, min_rear, max_rear, n_pair;
double rate[_max_pair_], *p_rate=rate, rate_sort[_max_pair_], diff, min_diff=(double)0x7fffffff ;
void set_rears( int no, int min_val )
{
if( no==n_rear ) {
if( front[n_front-1]*rear[n_rear-1]<3*front[0]*rear[0] )
return;
memcpy( rate_sort, rate, sizeof(double)*n_pair ) ;
sort( rate_sort, rate_sort+n_pair ) ;
diff=0 ;
for(double *pr=rate_sort; pr!=rate_sort+n_pair-1; pr++)
diff += (*pr - *(pr+1))*(*pr - *(pr+1)) ;
diff -= (rate_sort[n_pair-1]-rate_sort[0])*((rate_sort[n_pair-1]-rate_sort[0])/(n_pair-1));
if ( diff < min_diff) {
min_diff = diff;
memcpy(best_front, front, sizeof(int)*n_front );
memcpy(best_rear, rear, sizeof(int)*n_rear );
}
return ;
}
for( int i=min_val; i<=(max_rear-(n_rear-no-1)); i++) {
rear[no]=i;
for( int i_front=0; i_front<n_front; i_front++ )
*(p_rate++) = ((double)front[i_front])/i ;
set_rears( no+1, i+1 );
p_rate -= n_front ;
}
}
void set_fronts( int no, int min_val) {
if ( no==n_front )
set_rears( 0, min_rear ) ;
else
for( int i=min_val; i<=(max_front-(n_front-no-1)); i++)
set_fronts( no+1, (front[no] = i) + 1 );
}
int main(){
freopen("cowcycle.in", "r", stdin);
freopen("cowcycle.out", "w", stdout);
cin >> n_front >> n_rear >> min_front >> max_front >> min_rear >> max_rear ;
n_pair = n_front * n_rear ;
set_fronts( 0, min_front ) ;
for(int i=0; i<n_front; i++ )
cout << best_front[i] << (i!=n_front-1 ? ' ' : '\n');
for(int i=0; i<n_rear; i++ )
cout << best_rear[i] << (i!=n_rear-1 ? ' ' : '\n');
return 0;
}
发表评论
-
USACO Training Section 4.2 Job Processing
2010-01-30 17:31 1133英文原题 中文题译 大意: 有N个工件,每个工件要经 ... -
USACO Training Section 4.2 Drainage Ditches ISAP非递归和多路增广递归
2010-01-29 19:39 1849郁闷。不小心覆盖了重 ... -
USACO Training Section 4.2 The Perfect Stall 匈牙利算法的递归和非递归实现
2010-01-28 21:21 1645英文原题 中文题译 ... -
USACO Training Section 4.1 Cryptcowgraphy 奶牛密码
2010-01-27 20:58 1195英文原题 中文题译 大意: 奶牛们要从农场逃跑 ... -
USACO Training Section 4.1 Beef McNuggets
2010-01-26 21:37 968英文原题 中文题译 大意: 给定N个正整数, ... -
USACO Training Section 4.1 Fence Loops
2010-01-24 20:14 1064英文原题 大意: 农夫布朗的牧场上的篱笆已经失 ... -
USACO Training Section 3.4 Closed Fences
2010-01-23 17:50 1404英文原题 题意 一个 ... -
USACO Training Section 3.4 American Heritage
2010-01-21 23:19 771英文原题 大意:有一个由最多26个大写字母构成的二叉树 ... -
USACO Training Section 3.4 Raucous Rockers
2010-01-21 23:09 798英文原题 大意:有S首歌,要放到D个CD里。每首歌有一个 ... -
USACO Training Section 3.4 Electric Fence
2010-01-21 12:57 970英文原题 大意:给定一个三角形(0,0),(m,n),( ... -
USACO Training Section 3.3 Riding the Fences
2010-01-20 23:38 1206英文原题 中文题译 经典的求欧拉路径:给定最多两个奇 ... -
USACO Training Section 3.3 Shopping Offers
2010-01-19 22:18 915英文原题 中文题译 这是个与日常生活相关的题。商场促销 ... -
USACO Training Section 3.3 A Game
2010-01-19 20:54 1093英文原题 有如下一个双人游戏:N(2 <= N & ... -
USACO Training Section 3.3 Home on the Range
2010-01-19 19:36 772英文原题 中文题译 大意:给定一个01矩阵,计算其中全为 ... -
USACO Training Section 3.3 Camelot
2010-01-19 03:39 1232英文原题 中文题译 ... -
USACO Training Section 3.2 Sweet Butter
2010-01-19 00:10 1046英文原题 中文题译 大意:农场之间有路构成稀疏无向图,若 ... -
USACO Training Section 3.2 Magic Squares
2010-01-18 23:11 930英文原题 中文题译 大意:有人发明了一种有8个块三种变换 ... -
USACO Training Section 3.2 Feed Ratios
2010-01-18 20:52 1307英文原题 中文题译 大意:给出整数a[i][j]和 ... -
USACO Training Section 3.2 Spinning Wheels
2010-01-18 19:37 868英文原题 中文题译 大意:有五个纺车飞轮,每个都有最多五 ... -
USACO Training Section 3.2 Stringsobits
2010-01-18 01:04 990英文原题 中文题译 大意:求至多有L个1的第i个N位二进 ...
相关推荐
ACM----USACO Training(解题博客网),提供了USACO Training解题的代码,可以参考一下
自己写的usaco_training带代码。供参考,有一道题是cheat的。自己看吧。
usaco测试数据+标程 usaco的section1到section5的所有测试数据 以及标准程序
usaco解题报告,就是usaco.training.gateway上面的题目全解
USACO题解+代码+翻译,好东西,超级齐全,对大家帮助不小,特别是现在nocow挂了
usaco section2.3--section5.5源程序。。。。。。。。。。。。。。。。
[USACO 1.1.4]破碎的项链.cpp
USACO1-5单元AC的代码~ 1 Chapter1 1.1 Section 1.1 ...4.2 Section 4.2 4.3 Section 4.3 4.4 Section 4.4 5 Chapter5 5.1 Section 5.1 5.2 Section 5.2 5.3 Section 5.3 5.4 Section 5.4 5.5 Section 5.5
USACO全部译题 USACO Training Program Gateway
USACO_培训USACO_培训Ride.java-> Gift1.java->
第二行到第 N+1 行: 每行有三个整数,Si, Ei, 和 Ci 第一个星期,农夫约翰随便地让 第一行 两个整数,N (0 ) 和 M
USACO training 教程翻译合集(清晰明确)
USACO培训页面美国计算机奥林匹克训练页2015年6月17日开始
One of the answer of the USACO training exercises.
usaco 合集,包括英文原题和中文译题,测试数据以及答案,很全啊!usaco 合集usaco 合集usaco 合集usaco 合集
usaco历年测试数据
usaco 2010-2011 nov news,喜欢usaco的朋友可以看看
USACO培训网站 我为章节解决方案。 每个文件的多行USACO标识信息注释 第1章全部的解决方案 第2章全部的解决方案
USACO题集及答案
个人usaco题解,更新至4.2