7-5 爬旗杆 (15分)
小C从小很调皮, 调皮的小孩聪明啊。小C的小学有一根金属旗杆, 每天做早操前,小朋友们都要举行升国旗仪式,小C每次看到国旗徐徐上升,边唱国歌、边敬礼、边发呆。一天小C突然想爬到旗杆顶,有想法就要付诸行动。已知旗杆n米高,小C爬行速度为x米/秒,因为旗杆很滑,爬行很费力,小C体力有限,所以每过t秒,要休息2秒, 也因为旗杆滑,不爬行时,小C会从旗杆上滑下来,下滑的速度为y米/秒。
输入格式:
多组测试数据, 每行输入4个整数n x y t。 (1<=n,x,t,y<=1000)
输出格式:
输出小C到达杆顶的时间,精确到秒,如果小C到达不了杆顶,输出-1。每个输出占一行。
输入样例:
在这里给出一组输入。例如:
5 4 4 2
9 4 4 2
输出样例:
在这里给出相应的输出。例如:
2
-1
感觉没问题,就是过不了
#include <bits/stdc++.h>
using namespace std;
int main ()
{
int n,x,y,t;
while(~scanf("%d%d%d%d",&n,&x,&y,&t))
{
if(x*t>=n)//一次爬上
{
int l=0;
for(int i=1;;i++)
{
l+=x;
if(l>=n)
{
printf("%d\n",i);
break;
}
}
}
if(x*t<n)//一次爬不上
{
if(x*t-y*2<=0)//爬行减去滑下小于等于0,即做的无用功
printf("-1\n");
else// 爬行减滑下大于0,循环计算时间
{
int m,h;
m=x*t-y*2;
for(int j=t;;j+=t)
{
h+=m;
if(h>=n)//爬行距离之和超过旗杆高度,跳出循环
{
printf("%d\n",j);
break;
}
}
}
}
}
return 0;
}
正确代码
#include <stdio.h>
int main ()
{
int n,x,y,t,h,i,b,c;
double a;
while(~scanf("%d%d%d%d",&n,&x,&y,&t))
{
if(x*t>=n)
{
a=1.0*n/x;
if(a>n/x) printf("%d\n",n/x+1);
else printf("%d\n",n/x);
}
else if(x*t-y*2<=0) printf("-1\n");
else
{
h=n;
for(i=1;;i++)
{
h=h-(x*t-y*2);
if(h<=x*t) break;
}
a=1.0*h/x;
if(a>h/x) printf("%d\n",i*(t+2)+h/x+1);
else printf("%d\n",i*(t+2)+h/x);
}
}
return 0;
}