java分段计算面试题

AmazingZ 2015-10-10 03:55:38
加精
小王和小李喜欢赛车,其中有些赛段有限速要求。
现在有一段赛段总长100公里,要分为N段,每段有一定限速(均由用户输入),求某点到某点的最短时间,不超速。
例如
输入:
4//分为4段
0 20 10//每段起,终,最高速度
20 40 20
40 80 40
80 100 20
10 80//出发点,终止点
输出则为:
2.50(要求保留小数点后两位)
...全文
3022 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
奈何在人间 2017-10-12
  • 打赏
  • 举报
回复
楼主 你这个题目出的不全啊 首先从你的题目来看 想要达到你说的两点之间的最短时间,那么车的速度就要达到在那一段路程当中所限的速度的最高速度(也就是限速的速度) 口算一下是3 4//分为4段 0 20 10//每段起,终,最高速度 20 40 20 40 80 40 80 100 20 10 80//出发点,终止点 10-20 用时1 20-40 用时1 40-80 用时1 10-80 用时3 如果按照这个标准来算的话 时间肯定是3.00小时 而你上面你自己说的时间是2.50 这就矛盾了 因为我已经是在哪一段时间中所限速的最高速度来算的时间最短就是三个小时. 而且车子肯定不可能速度从一个速度直接跳转到另一个速度的,所以题目当中应该还提供了一个汽车的加速度,这样的话我们就可以假设 起点0公里处的速度是0km/h在0km-20km之间一开始是加速状态直到速度达到10km/h或者车子行驶到离小李家20km处 以此类推后面的所处位置的速度 这样算出来的时间才是对的 所以只从你出的题目上来看(不看你局的那个例题),一楼的无疑是正解.
TheBigBangWOW 2015-11-03
  • 打赏
  • 举报
回复
非常感谢,学习了,谢谢
w543705344 2015-10-21
  • 打赏
  • 举报
回复
引用 16 楼 zhi_ai_yaya 的回复:
[quote=引用 15 楼 w543705344 的回复:] 口算一下是3 4//分为4段 0 20 10//每段起,终,最高速度 20 40 20 40 80 40 80 100 20 10 80//出发点,终止点 10-20 用时1 20-40 用时1 40-80 用时1 10-80 用时3 然后用个人所得税方法是最简单的 不过。。限速是限速 但是实际情况没有加减速么。。。。。
加减速,只是把匀速直线运动公式改为加速度直线运动公式 [/quote] 想想也是有公式都一样的
我叫小菜菜 2015-10-20
  • 打赏
  • 举报
回复
引用 15 楼 w543705344 的回复:
口算一下是3 4//分为4段 0 20 10//每段起,终,最高速度 20 40 20 40 80 40 80 100 20 10 80//出发点,终止点 10-20 用时1 20-40 用时1 40-80 用时1 10-80 用时3 然后用个人所得税方法是最简单的 不过。。限速是限速 但是实际情况没有加减速么。。。。。
加减速,只是把匀速直线运动公式改为加速度直线运动公式
qq_32168231 2015-10-20
  • 打赏
  • 举报
回复
我也想要书,但是您肯定不送,不过没关系,我去买买买。
w543705344 2015-10-15
  • 打赏
  • 举报
回复
口算一下是3 4//分为4段 0 20 10//每段起,终,最高速度 20 40 20 40 80 40 80 100 20 10 80//出发点,终止点 10-20 用时1 20-40 用时1 40-80 用时1 10-80 用时3 然后用个人所得税方法是最简单的 不过。。限速是限速 但是实际情况没有加减速么。。。。。
one_by_one_up 2015-10-15
  • 打赏
  • 举报
回复
赞一个,可以拿点分不
L_is_Elle 2015-10-14
  • 打赏
  • 举报
回复
引用 8 楼 zhi_ai_yaya 的回复:


知道这个税的【速算扣除数】的含义吗,这就是解题的关键~

先根据动态输入的分段数据构造出点0到x点的时间函数:time=f(x)。
最后根据输入起点x0和终点x1,做减法:time=f(x1)-f(x0)

这种算法相对比较简便,直接封装一个时间函数就搞定了。
解开者 2015-10-14
  • 打赏
  • 举报
回复
改用Guava实现,提高效率
		RangeMap<Integer, Integer> map = TreeRangeMap.create();
Scanner in = new Scanner(System.in);
int n = Ints.tryParse(in.nextLine());
for (int i = 0; i < n; i++) {
String[] s = in.nextLine().split(" ");
map.put(Range.closedOpen(Ints.tryParse(s[0]), Ints.tryParse(s[1])),
Ints.tryParse(s[2]));
}
String[] s = in.nextLine().split(" ");
map = map.subRangeMap(Range.closedOpen(Ints.tryParse(s[0]),
Ints.tryParse(s[1])));
double z = 0;
for (Map.Entry<Range<Integer>, Integer> entry : map.asMapOfRanges()
.entrySet()) {
z += (double) (entry.getKey().upperEndpoint() - entry.getKey()
.lowerEndpoint()) / entry.getValue();
}
System.out.println(String.format("%.2f", z));
仰望星空_Star 2015-10-14
  • 打赏
  • 举报
回复
都是大神啊
AmazingZ 2015-10-14
  • 打赏
  • 举报
回复
引用 3 楼 xuxiaoyinliu 的回复:
楼主你好,这个问题很有意思啊,可以看看你写的代码吗?我也写了一个但是看起来代码很多,算法应该有问题,想参考下你的再修改一下,谢谢

package exercise15;

import java.util.Scanner;

public class Driver {
public static void main(String[] args) {
java.text.DecimalFormat df = new java.text.DecimalFormat("#.00");
Scanner sc = new Scanner(System.in);
int N = Integer.valueOf(sc.nextLine());
int[][] data = new int[N+1][3];
int x = 0;
while(x<N+1) {
String[] temp = sc.nextLine().split("\\s+");
for(int i=0;i < temp.length;i++) {
data[x][i] = Integer.valueOf(temp[i]);
}
x++;
}
int start = data[N][0];
int end = data[N][1];
int m=0,n=0;
for(int i=0;i < N; i++) {
if(start > data[i][1]){
m++;
}
if(end > data[i][1]){
n++;
}
}
double first = (double)(data[m][1] - start)/(double)data[m][2];
double last = ((double)(end - data[n][0])/(double)data[n][2]);
double sum=0;
for(int i=0;i < n-m-1;i ++){
sum+=((double)(data[m+1][1] - data[m+1][0]))/(double)data[m+1][2];
}
sum=sum+first+last;
System.out.println(df.format(sum));
sc.close();
}

}
_寿大寿 2015-10-14
  • 打赏
  • 举报
回复
谢谢很实用啊
我叫小菜菜 2015-10-13
  • 打赏
  • 举报
回复


知道这个税的【速算扣除数】的含义吗,这就是解题的关键~

先根据动态输入的分段数据构造出点0到x点的时间函数:time=f(x)。
最后根据输入起点x0和终点x1,做减法:time=f(x1)-f(x0)
eccel 2015-10-13
  • 打赏
  • 举报
回复
树状数组-轻松解决
时间复杂度O(lgN)
Dark_start 2015-10-13
  • 打赏
  • 举报
回复
引用 4 楼 wjxtju 的回复:
说实在感觉让输入4分段就让人很不爽.
感觉有点机械.让人没兴趣写.感觉写不出有感觉的.
要是直接输入1到100 defaultSpeed.然后输入路段,自动分还有意思点.,否则输入要求太严格,怎么也感觉跟路差距有点远.

重要的不是你感觉爽不爽,需求设计就是这样你重写的话其实就已经不是本来的问题了。
AmazingZ 2015-10-12
  • 打赏
  • 举报
回复
引用 1楼解开者 的回复:
输出不应该是3.00吗?
int[] a = new int[100];
int n;
Scanner in = new Scanner(System.in);
n = Integer.parseInt(in.nextLine());
for (int i = 0; i < n; i++) {
String[] s = in.nextLine().split(" ");
int l = Integer.parseInt(s[0]);
int r = Integer.parseInt(s[1]);
int x = Integer.parseInt(s[2]);
for (int j = l; j < r; j++) {
if (a[j] < x) {
a[j] = x;
}
}
}
String[] s = in.nextLine().split(" ");
int l = Integer.parseInt(s[0]);
int r = Integer.parseInt(s[1]);
double z = 0;
for (int i = l; i < r; i++) {
z += 1.0/a[i];
}
System.out.println(String.format("%.2f", z));
我自己做出来了,还是得靠自己啊,这个数据需要自己输入,不是就这几个数据的。
解开者 2015-10-12
  • 打赏
  • 举报
回复
输出不应该是3.00吗?
int[] a = new int[100];
int n;
Scanner in = new Scanner(System.in);
n = Integer.parseInt(in.nextLine());
for (int i = 0; i < n; i++) {
String[] s = in.nextLine().split(" ");
int l = Integer.parseInt(s[0]);
int r = Integer.parseInt(s[1]);
int x = Integer.parseInt(s[2]);
for (int j = l; j < r; j++) {
if (a[j] < x) {
a[j] = x;
}
}
}
String[] s = in.nextLine().split(" ");
int l = Integer.parseInt(s[0]);
int r = Integer.parseInt(s[1]);
double z = 0;
for (int i = l; i < r; i++) {
z += 1.0/a[i];
}
System.out.println(String.format("%.2f", z));
仰望星空_Star 2015-10-12
  • 打赏
  • 举报
回复
引用 4 楼 wjxtju的回复:
说实在感觉让输入4分段就让人很不爽.
感觉有点机械.让人没兴趣写.感觉写不出有感觉的.
要是直接输入1到100 defaultSpeed.然后输入路段,自动分还有意思点.,否则输入要求太严格,怎么也感觉跟路差距有点远.
分段确实有点麻烦,我试着写了一下虽然很难看但是功能还能实现
wjxtju 2015-10-12
  • 打赏
  • 举报
回复
说实在感觉让输入4分段就让人很不爽.
感觉有点机械.让人没兴趣写.感觉写不出有感觉的.
要是直接输入1到100 defaultSpeed.然后输入路段,自动分还有意思点.,否则输入要求太严格,怎么也感觉跟路差距有点远.
仰望星空_Star 2015-10-12
  • 打赏
  • 举报
回复
楼主你好,这个问题很有意思啊,可以看看你写的代码吗?我也写了一个但是看起来代码很多,算法应该有问题,想参考下你的再修改一下,谢谢

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧