c++贪心:骑车上学

c++骑车上学

  1. 问题反思
    刚看到这个问题时,我把这个问题和奶牛吃花的问题混到一起了。一方面因为这两个题都需要同时考虑两种问题要素:奶牛吃花需要考虑奶牛吃花的速度和距离牛圈的远近;骑车上学需要考虑不同学生骑车的速率和骑车开始的时间早晚。另一方面是因为我对于解决贪心问题的经验不足,从而忽视了骑车上学与奶牛吃花的不同点。奶牛吃花的问题在解决时每头奶牛被拉回牛圈的过程是分时进行的,而骑车上学中不同学生的上学过程有同时进行的部分。这就导致拉回每头奶牛所需的时间是互不干扰的;而每个换速率的时间点和前后学生的骑车速率与出发时间是息息相关的。
  2. 问题分析
    在经过同学的点拨后,我发现了一个很重要的问题:查理到校的时间就是第一个学生到校的时间,也就是说只要求出所有学生中到校最快的学生的到校时间,问题就迎刃而解了。
    这样一来问题就变得简单了。通过写入数据,我们知道了每个学生出发的时间和每个学生骑车的速率。根据已知条件路程,我们就可以求出所有学生到校的时间。
    这里我们用结构体存储每个学生的出发时间、速率和到校时间;
    这里我们用sort函数对所有学生的到校时间进行排序并输出最小值;
    这里我们用ceil函数对输出数据进行向上取整处理。
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
struct students
{
    int v,t;
    double T;
};
bool cmp(students &a,students &b)
{
    return a.T<b.T;
}
void sum(students &a)
{
    double c;
    const double s=4.5;
    c=a.t+s/a.v*3600;
    a.T=c;
}
int main()
{
    students st[10001];
    int n;
    while(cin>>n)
    {
    if(n==0)
        break;
    for(int i=0;i<n;i++)
    {
        cin>>st[i].v>>st[i].t;
        if(st[i].t<0)
        {
            i--;
            n--;
        }
        sum(st[i]);
    }
    sort(st,st+n,cmp);
    cout<<ceil(st[0].T)<<endl;
    }
    return 0;
}
  1. 知识学习
    ceil()对浮点数据向上取整
    floor()对浮点数据向下取整
    round()对浮点数据做四舍五入处理

  2. 反思
    解决贪心的思路应该有两种大方向:
    一种是将程序任务分成许多小任务去完成,每一个小任务需要找一个最优解,这种思路往往需要考虑各个小任务进行的互相影响,因此通常解决小任务互不干扰的贪心问题;
    另一种是只考虑问题的大任务的完成情况选择最优解,这种思路通常用来解决一些可以拥有多种方案去完成的任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flww*星火燎原

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值