网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
11月17日
漏签
0
天
c语言吧
关注:
797,538
贴子:
4,337,059
看贴
图片
吧主推荐
视频
游戏
33
回复贴,共
1
页
<<返回c语言吧
>0< 加载中...
求个问,这道题,怎么编写代码o()^))o 唉
只看楼主
收藏
回复
美川内弈
酱油
4
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
哥哥和弟弟在一周长为800米的环形跑道上赛跑,已知哥哥每分钟跑60米,弟弟每分钟跑40米。现在哥哥和弟弟沿着跑道同时、同地、同向起跑,且二人每跑200米都要停下来休息2分钟,那么()分钟后哥哥第一次追上弟弟。
主要是这个休息2分钟,感觉很难搞。。。
笑一A
大能力者
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
首先,哥哥追到弟弟,总共跑了800/(60-40)=40分钟!在这40分钟里,哥哥走了60*40=2400米,每200米停2分钟!停了2400/200-1=11次,即11*2=22分钟!所以,应该是40+22=62分钟吧!
笑一A
大能力者
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
应该是5分钟即可!因为哥哥跑200米,花了3.3分钟,弟弟跑200米,需要5分钟!而哥哥要休息2分钟,所以,弟弟跑到200米处,哥哥还要休息0.3分钟!所以,5分钟他们就相遇了!
别急
麻婆豆腐
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
“哥哥追上弟弟”和“相遇”是一回事么。
笑一A
大能力者
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
想了一个比较复杂的算法:
假设以1为单位距离,我不假设哥哥追上弟弟,而是弟弟追上哥哥(当然,情况差不多)
弟弟追上哥哥的时候,假设哥哥是在弟弟的前面,因为是时间最短,则哥哥恰好在休息,弟弟利用这2分钟追上哥哥(弟弟此时不休息),在此之前,哥哥已走x米,那么哥哥走了(x/60)分钟,加上休息时间(int)(x/200)*2,哥哥用的时间是(x/60)+(int)(x/200)*2,设弟弟跑了t分钟,则存在(t+(int)(40t/200)*2)= (x/60)+(int)(x/200)*2(总时间是相同的嘛),因为弟弟现在还要跑2分钟,所以弟弟总共跑(t+2)分钟,则:
40*(t+2)%800 >=(x)%800 (因为在一个圈内,所以用同余)
笑一A
大能力者
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
这个算法,f1(s)是返回哥哥走了s米的时间函数,他是一个结构体,返回两个值,当且仅当s%200==0,第二个值=第一个值+2;为了简便:记做f1(s).a与f1(s).b;显然f1(s).a与f1(s).b构成的区间与f2(s%800).a,f2(s%800).b构成的区间有交集!s就是所求!时间就简单了!
one_summers
异能力者
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
可设哥哥跑了t分钟 则休息了60t/100分钟 弟弟跑了x分钟则休息了40x/100分钟 而他们在跑道上的时间是相同的 只是哥哥比弟弟多跑了800米而已 所以 有两个方程 0.4x+x=0.6t+t 60t=40x+800 解得x=64 t=56 哥哥只有在跑的时候才可以追上弟弟 则x为62 这只是兄弟两人在奔跑时花费的时间 而弟弟休息了32.4分钟 哥哥休息了38.4分钟 则共用94.4分钟
one_summers
异能力者
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
正解 取3000为分界点 哥走了78分钟 再加上休息的两分钟 共80分钟
弟在77分钟之中走了2320 则他在第80分钟还正在走 还有两分钟
那就好办 3000米 哥哥已休息两分钟 弟弟已走2320米还要走两分钟他们相距120米 则当弟弟走了两分钟后他休息了 而哥哥也走了两分钟120米还在继续走要走弟弟走过的80米 也就是说哥哥在刚好走了200米 就追上了弟弟 哥哥用时为80+200/60=83.33
笑一A
大能力者
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
#include<stdio.h>#include<math.h>
int Len(double t,double v)
//计算“路程",路程是”时间“的函数,哥哥、弟弟的时间是相同的,但速度不一致,
{
double t1; int k;
t1 = 200.0/v + 2;k = (int)(t/t1);
if( t - t1*k < 200.0/v)
return (int)(200*k + (t - t1*k )*v);
else return 200*(k+1);
}
int main(){
double t=0; int s1,s2;
while(1){ t += 1.0/60;
//以哥哥(速度快的为“单位时间” = 1米/速度)
//弟弟在[0,1]区间,哥哥在[799,800]区间
s1 = Len(t - 1.0/60,60.0) % 800 ; s2 = Len(t- 1.0/60,40.0) % 800;
if(Len(t,60.0) % 800 == Len(t,40.0) % 800 && ( s1 < s2 || (s1 >=799 &&s2<=1 ) ) )
{
printf("哥哥走了%d米,用了%f时间追上弟弟\n",Len(t,60.0),t);break;
}
}
return 0;
}
笑一A
大能力者
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
用程序证明了最短时间是83.33,走了3200米,追上弟弟,不过程序运行的时间是83.35,不知道怎么改这个时间呢?
@one_summers
笑一A
大能力者
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
//这个应该算出83.33这个较正确的数值。。
#include<stdio.h>
#include<math.h>
typedef struct Time_1
{
double a;
double b;
}time;
int Len(double t,double v)
//计算“路程",路程是”时间“的函数,哥哥、弟弟的时间是相同的,但速度不一致,
{
double t1; int k; t1 = 200.0/v + 2;
k = (int)(t/t1); if( t - t1*k < 200.0/v)
return (int)(200*k + (t - t1*k )*v); else
return 200*(k+1);
}
time Time(int len,double v) //存放在结构体,
{
time tt; tt.a = tt.b = 0.0;
double t= 0.0; int i;
for(i=1;i<=len;i++)
{
tt.a = tt.b; tt.a += 1.0/v; tt.b += 1.0/v;
if(i % 200 == 0 )
tt.b+= 2;
}
return tt;
}
int main()
{ double t=0; int s1,s2,s;
while(1)
{
t += 1.0/60; //以哥哥(速度快的为“单位时间” = 1米/速度 )
//弟弟在[0,1]区间,哥哥在[799,800]区间
s1 = Len(t - 1.0/60,60.0) % 800 ; s2 = Len(t- 1.0/60,40.0) % 800;
if(Len(t,60.0) % 800 == Len(t,40.0) % 800 &&( s1 < s2 || (s1 >=799 &&s2<=1 ) ) )
{
s = Len(t,60.0); break;
}
}
printf("哥哥走了%d米\n",s);
printf("哥哥的左值=%f分钟,右值=%f分钟\n", Time(s,60.0).a,Time(s,60.0).b);
printf("弟弟的左值=%f分钟,右值=%f分钟\n", Time(s-800,40.0).a,Time(s-800,40.0).b);
//求出“相交”区间的最小值.. 则为所求..此处不写了,
//....
return 0;
}
小忍and奏
超能力者
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
…你是来问解的吧- -
沐在水中流
团子家族
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
星辰天耀
帕秋莉糕
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
小学奥数无误
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示