http://poj.org/problem?id=2673
题目描述:一个人有t秒时间,每秒能干x量的工作。有m只动物,开始时,第i只动物离人有di的距离,它的速度是si每秒。只要人干活,动物就朝人走,如果不干活,动物就原路返回。
要求动物不能达到人,问人最多能干多少工作。
解题报告:
首先得到最先到达人的动物的时间,记下这个时间减一记作re,所以人第一次停止工作是在re 1秒的时候。
所以,如果re == 0,工作量只能是0.
如果re >= t,那人就不用停止工作,工作量最大:t * x。
最后,re < t,首先人能工作re的时间,剩下的时间可以认为休息1秒(同时动物往回跑一秒),然后工作一秒,所以剩下的时间平分就是工作时间。答案 (re (t - re) / 2) * x
#include
<
iostream
>
using namespace std;
int main(){
int t,x,m;
int d,s;
int temp,min = 1000000000 ;
int allTime;
cin >> t >> x >> m;
while (m -- ){
scanf( " %d%d " , & d, & s);
// 凡是有除法的运算,都要处理除数等于零时的情况
if (s == 0 ) continue ;
if (d % s == 0 )temp = d / s - 1 ;
else temp = d / s;
if (min > temp)min = temp;
}
if (t >= min)
allTime = min + (t - min) / 2 ;
// 特殊情况1,人可以一直工作,即min>t的情形
else allTime = t;
// 特殊情况2
if (min == 0 )allTime = 0 ;
cout << x * allTime << endl;
return 0 ;
}
using namespace std;
int main(){
int t,x,m;
int d,s;
int temp,min = 1000000000 ;
int allTime;
cin >> t >> x >> m;
while (m -- ){
scanf( " %d%d " , & d, & s);
// 凡是有除法的运算,都要处理除数等于零时的情况
if (s == 0 ) continue ;
if (d % s == 0 )temp = d / s - 1 ;
else temp = d / s;
if (min > temp)min = temp;
}
if (t >= min)
allTime = min + (t - min) / 2 ;
// 特殊情况1,人可以一直工作,即min>t的情形
else allTime = t;
// 特殊情况2
if (min == 0 )allTime = 0 ;
cout << x * allTime << endl;
return 0 ;
}