学习材料:《2013年王道论坛计算机考研机试指南》
文中涉及对学习材料的摘录,以及自己的理解
1 题目【例2.11】:
1.1 题目分析:
总共拥有M pounds钱,去买N个room的X吨food;
第i个房间有J[i]吨food,对应所需F[i] pounds的钱;
如果剩余的钱不够买一个房间的全部食物,可以只买部分,那么 J[i] * a%吨食物 需要 F[i] * a% pounds的钱
目标——用有限的M pouds钱买尽可能多的食物
1.2 解题思路:
本质:在剩余储藏食物的房间中找性价比最高的房间 , 即 J[i] / F[i]最高的, 那么就应将N个房间按食物量与价格的性价比降序排列;
限制条件:依次购买按性价比降序排列的房间中的食物,直到钱花完或者购买完N个房间的食物;
注意:当最后剩余的钱不够买整个房间的食物,就按题中所述百分比购买部分
1.3 代码:
#include
/* 只要涉及排序 用到sort 就有以下固定程序结构 */
#include
using namespace std;
struct FoodRoom{
int j; //该房间的食物量
int f; //该房间食物的总价格
double s; //该房间食物的性价比 (double)j/f
bool operator <(const FoodRoom &A)const{
return s > A.s; //重载<运算符,便于使用sort函数;又sort函数是升序 这里返回>运算 就可以实现降序
}
}RoomBuf[1000];
int main()
{
int M,N;
while( scanf("%d%d",&M,&N) != EOF ){
if( (M==-1) && (N==-1) ) break;
int i; //房间号下标
for(i=0; i0)&&(i RoomBuf[i].f )
{
M -= RoomBuf[i].f;
ans += RoomBuf[i].j;
}//若能买下整个房间的食物
else
{
ans += ((double)M)/RoomBuf[i].f * RoomBuf[i].j;
M = 0;
}//只能买房间的部分食物
i ++;
}
printf("%.3lf\n",ans );
}
return 0;
}
2 题目【例2.12】:
2.1 题目分析:
N个节目,每个节目的开始、结束时间已知:Time_s, Time_e;
目标:看尽量多的完整节目 ; 输出:所看的完整节目个数;
贪心策略:第一个节目选什么? 验证不是“开始时间最早的节目”,不是“持续时间最短的节目”, 而应该先看结束时间最早的节目
程序结束条件:依次选择结束时间最早的节目先看,直到看完最后一个节目,注意遍历N个节目的过程中,只有看完整的节目,才能算+1
2.2 代码:
#include
#include
using namespace std;
struct TvTime{
int Time_s; //开始时间
int Time_e; //结束时间
bool operator < (const TvTime &A) const{
//贪心策略为选择所有节目中结束时间最早的先看,所以重载<运算符,以实现按结束时间升序排列
return Time_e < A.Time_e;
}
}TvBuf[100];
int main(){
int N;
while( scanf("%d",&N) != EOF ) {
if(N==0) break; //break 整个while循环 调试时就是跳出命令行窗口
int i; //节目编号
for(i=0; i
总结:选择一个合适的贪心策略需要一定的技巧。 也就是判断在具体问题中,什么才是“当前最好的”,当前最优解。