c++骑车上学
- 问题反思
刚看到这个问题时,我把这个问题和奶牛吃花的问题混到一起了。一方面因为这两个题都需要同时考虑两种问题要素:奶牛吃花需要考虑奶牛吃花的速度和距离牛圈的远近;骑车上学需要考虑不同学生骑车的速率和骑车开始的时间早晚。另一方面是因为我对于解决贪心问题的经验不足,从而忽视了骑车上学与奶牛吃花的不同点。奶牛吃花的问题在解决时每头奶牛被拉回牛圈的过程是分时进行的,而骑车上学中不同学生的上学过程有同时进行的部分。这就导致拉回每头奶牛所需的时间是互不干扰的;而每个换速率的时间点和前后学生的骑车速率与出发时间是息息相关的。 - 问题分析
在经过同学的点拨后,我发现了一个很重要的问题:查理到校的时间就是第一个学生到校的时间,也就是说只要求出所有学生中到校最快的学生的到校时间,问题就迎刃而解了。
这样一来问题就变得简单了。通过写入数据,我们知道了每个学生出发的时间和每个学生骑车的速率。根据已知条件路程,我们就可以求出所有学生到校的时间。
这里我们用结构体存储每个学生的出发时间、速率和到校时间;
这里我们用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;
}
-
知识学习
ceil()对浮点数据向上取整
floor()对浮点数据向下取整
round()对浮点数据做四舍五入处理 -
反思
解决贪心的思路应该有两种大方向:
一种是将程序任务分成许多小任务去完成,每一个小任务需要找一个最优解,这种思路往往需要考虑各个小任务进行的互相影响,因此通常解决小任务互不干扰的贪心问题;
另一种是只考虑问题的大任务的完成情况选择最优解,这种思路通常用来解决一些可以拥有多种方案去完成的任务。