一道关于循环判断的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

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

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

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

最后

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

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

哈哈,可以说谢邀了。

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

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

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

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

int main() {
int n;
int i = 0, j = 0, k = 0, m = 0;
char mao;
char kong;
double weight[100];
int hour[100];
int minute[100];
float speed[100];
int t[100];
float t1[100];
float t2[100];
float t3[100];
float sum = 0;
int hour1;
int minute1;
scanf("%d", &n);
for (i; i < n; i++) {
scanf("%lf%c%d%c%d", &weight[i],&kong, &hour[i], &mao, &minute[i]);
//printf("%lf\n%d\n%d\n", weight[i], hour[i], minute[i]);
}
for (i = 0; i < n; i++) {
if (weight[i] <= 10) {
speed[i] = 200 / (60 * pow(10, (1.0 / 3)));
}
else if (weight[i] > 10 && weight[i] <= 20) {
speed[i] = 200 / (60 * pow(20, (1.0 / 3)));
}
else if (weight[i] > 20 && weight[i] <= 30) {
speed[i] = 200 / (60 * pow(30, (1.0 / 3)));
}
else if (weight[i] > 30 && weight[i] <= 40) {
speed[i] = 200 / (60 * pow(40, (1.0 / 3)));
}
else if (weight[i] > 40 && weight[i] <= 50) {
speed[i] = 200 / (60 * pow(50, (1.0 / 3)));
}
}
for (i = 0; i < n; i++) {
t[i] = 60 * hour[i] + minute[i];
t1[i] = (50.0 / speed[i]) + t[i];
t2[i] = (66.0 / speed[i]) + t[i];
// printf("%d\n%f\n%f\n", t[i],t1[i],t2[i]);
}
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (t1[i] >= t1[j] && t1[i] < t2[j]) {
sum = sum + weight[j];
}
}//printf("%f\n", sum);
if (sum > 70) {
t3[i] = t1[i];
}
else { t3[i] = t[0]; }
sum = 0;
// printf("%f\n", t3[i]);
}
for (k = 0; k < n - 1; k++) {
for (m = 0; m < n - 1 - k; m++) {
if (t3[m] > t3[m + 1]) {
float abaaba = t3[m];
t3[m] = t3[m + 1];
t3[m + 1] = abaaba;
}
}
}
for (i = 0; i < n; i++) {
if (t3[i] != t3[0]) {
t3[0] = t3[i];
break;
}
}
hour1 = (int)t3[0] / 60;
float minute2 = t3[0] - hour1 * 60;
if (minute2 - (int)minute2 >= 0.5) {
minute1 = (int)minute2 + 1;
}
else { minute1 = (int)minute2; }
printf("%02d:%02d", hour1, minute1);
}