weixin_56601830
Muriak
2021-03-27 23:29
采纳率: 100%
浏览 65

一道关于循环判断的C语言程序题。

假设有一座桥长度为16km,但是承重量只有70吨,距离桥入口50km处有一个货运站,每天不断有载重不同的货车从该站出发送货,途经该桥。该站的货车有五种型号,其最大载重M分别是10吨、20吨、30吨、40吨和50吨(自重不计),假设每种货车行驶的速度恒定,为200/(M^(1/3))km/h。对于给定的载重,管理员总会安排不超载的速度最快的货车进行运输。这座桥每天只有该货运站出发的货车通过,每天管理该站的人们都十分担心这座桥的安全,请帮他们算算看,每天的货运计划会不会让该桥发生倾塌的危险。

首先输入一个正整数N(不超过100),代表当日的发车数量。之后N行,每行第一个数据为该次运输的实际载重量(为double类型,且不超过50),第二个数据为发车时间(按从早到晚的顺序排列),用hh:mm表示,如09:05。

如果在某一时刻这座桥上的总重量超过70吨(所有货车自重不计),给出这座桥超重的最早时间(格式hh:mm,四舍五入精确到分钟)。如果当日没有出现这种情况,输出当日最早的发车时间(格式hh:mm)

#include<stdio.h>
#include<math.h>

int float_int(float x)
{
	int y;
	if((x-(int)x)>=0.5)
		y=(int)x+1;
	else
		y=(int)x;
	return y;
}

int  main()
{
	int n;
	int i,j;
	int weight[100],hour[100],minute[100];
	float speed[100];
	int time[100];
	float on[100],off[100];
	int total_weight=0;
	float break_time[200];
	int q,p;
	int temp;
	int hour_,minute_;

//输入发车次数n
	scanf("%d",&n);
//输入n次的总载重和发车时间
	for(i=0;i<n;i++)
		scanf("%d %d:%d",&weight[i],&hour[i],&minute[i]);
//循环,判断每一次用什么货车-速度(km/min)
	for(i=0;i<n;i++){
		if(weight[i]==10||weight[i]==20||weight[i]==30||weight[i]==40||weight[i]==50){
			speed[i]=200/(60*pow(weight[i],1.0/3));
		}
		else{
			switch(weight[i]/10){
				case 0:speed[i]=200/(60*pow(10,1.0/3));break;
				case 1:speed[i]=200/(60*pow(20,1.0/3));break;
				case 2:speed[i]=200/(60*pow(30,1.0/3));break;
				case 3:speed[i]=200/(60*pow(40,1.0/3));break;
				case 4:speed[i]=200/(60*pow(50,1.0/3));break;
			}
		}
	}
//用分钟数表示时间
	for(i=0;i<n;i++){
		time[i]=60*hour[i]+minute[i];
	}
//计算所有的上桥和下桥所用时间
	for(i=0;i<n;i++){
		on[i]=float_int(50/speed[i]+time[i]);
		off[i]=float_int(66/speed[i]+time[i]);
	}

//遍历每一个on节点,找出在该节点在桥上的所有车
for(i=0;i<n;i++){
	for(j=0;j<n;j++){
		if(on[j]<=on[i]&&off[j]>on[i]){
			total_weight+=weight[j];
		}
	}
	if(total_weight>70){
		break_time[i]=on[i];
	}
	else
		break_time[i]=time[0];
	total_weight=0;
}


//对break_time冒泡排序
	for(q=0;q<n-1;q++){
			for(p=0;p<n-1-q;p++){
				if(break_time[p]>break_time[p+1]){
					temp=break_time[p];
					break_time[p]=break_time[p+1];
					break_time[p+1]=temp;
				}
			}
		}



//判断有无超重的时间;若无,则break_time[0]=最早发车时间;若有,则break_time[0]=最早超重时间
	for(p=0;p<n;p++){
		if(break_time[p]!=time[0]){
			break_time[0]=break_time[p];
			break;
		}
	}

//将超重时间转换为小时:分钟格式
	hour_=float_int(break_time[0]/60);
	minute_=float_int(break_time[0])%60;
//输出结果
	printf("%02d:%02d\n",hour_,minute_);
}

一些典型测例好像都可以正确输出,但是OJ总是过不了,似乎还有bug

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • technologist_10
    CSDN专家-ProfSnail 2021-03-28 12:13
    已采纳

    您好,请检察一下代码中变量weight(重量)的设置情况。

    根据题目的要求,weight变量应该是一个double类型的变量,而您的代码中将其设置为了int型变量。

    可以按照这个思路,重新修改一下代码。如果有其他问题,欢迎继续留言讨论。

    点赞 评论
  • weixin_56601830
    Muriak 2021-03-28 11:08

    最后

    hour_=float_int(break_time[0]/60);

    这一行()有问题 已经发现了,应该是float_int(break_time[0])/60; 但改正之后仍然不对

    点赞 评论
  • ProfSnail
    ProfSnail 2021-03-28 11:19

    哈哈,可以说谢邀了。

    哇,好长的题目。我看一下啊。

    点赞 评论
  • QA_Assistant
    有问必答小助手 2021-03-29 10:38

    您好,我是问答小助手,看到您的问题已被解答,欢迎您加入CSDN!

    目前问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632

    点赞 评论

相关推荐