今晚举行的腾讯编程马拉松,监考过程看到第二题居然一直没人做出来,忍不住手痒做了一下。题目如下
赛车手 返回比赛首页
古哥是腾讯著名的赛车手。在一次特殊的内部赛车比赛中,古哥为了体现出他对参赛MM的关照,约定在比赛过程中有车速限制,每一个这样的限制都可以描述为一个三元组(s,t,d),表示在比赛的t时间开始,持续d时间的过程中,古哥的车速不会超过s.古哥为了在这种情况下依旧证明他强大的实力,想让聪明的你帮他求出在给定比赛时间T内,赛车的加速度最大为a的情况下,古哥可能行驶的最远距离。
PS:车速初始为0.
输入:
第一行为一个数Cases,用来描述有多少组数据。
对于每组测试数据,首先为一个数 n (0<=n<=50) 表示有 n个速度限制的三元组(s,t,d) 其中 0<=s<=100,0<=t<=T,0<=d<=1000
接下来为两个正整数T a,用来描述比赛总时长和汽车的最大加速度。其中0<=T<=1000, 0<=a<=25
输出:
对于每个测试数据,输出古哥可能行驶的最远距离,精确到0.0001。
样例输入:
2
0
998 1
2
10 10 10
20 30 20
50 1
样例输出:
498002.0000
700.0000
我用js(非指定竞赛语言),在规定时间内做到这样:
<html>
<head></head>
<body>
<textarea>2
0
998 1
2
10 10 10
20 30 20
50 1
5
2 1 2
6 4 3
4 7 1
5 10 1
1 12 1
12 2</textarea>
<script>
var data=document.getElementsByTagName("textarea")[0].value.split("\n");
var idx=0;
for(var i=1;i<data[0]+1;i++){
var limits=[]
n=data[++idx];
for(var j=0;j<n;j++){
limits.push(data[++idx].split(" "))
}
tmp=data[++idx].split(" ");
T=tmp[0]-0;
a=tmp[1]-0;
var speedAtRealTime=new Array(T+1);
speedAtRealTime[0]=0;
for(var j=1;j<=T;j++){
speedAtRealTime[j]=speedAtRealTime[j-1]+a;
}
for(var j=0;j<limits.length;j++){
for(var k=limits[j][1];k<=limits[j][1]-(-limits[j][2]);k++){
if(speedAtRealTime[k]>limits[j][0]-0){
speedAtRealTime[k]=limits[j][0]-0;
}
}
}
var adjustSpeed=true;
while(adjustSpeed){
adjustSpeed=false;
for(var j=1;j<=T;j++){
if(speedAtRealTime[j]-speedAtRealTime[j-1]>a){//加速不了那么快
speedAtRealTime[j]=speedAtRealTime[j-1]+a;
adjustSpeed=true;
}
}
for(var j=T;j>0;j--){
if(speedAtRealTime[j-1]-speedAtRealTime[j]>a){//要提前减速
speedAtRealTime[j-1]=speedAtRealTime[j]+a;
adjustSpeed=true;
}
}
}
alert(speedAtRealTime.join(","));
var length=0
for(var j=1;j<speedAtRealTime.length;j++){
length+=speedAtRealTime[j-1]+speedAtRealTime[j]
}
length=length/2;
alert(length)
}
</script>
</body>
</html>
结果还是差了临门一脚:
谁想出来的在一秒内还可以加速半秒减速半秒这么损的招啊?