因为语文太差弃赛,第一个追及问题看不懂我就弃赛了。打进复赛确实挺难的,补一下题,锻炼下就行了。
身体训练
时间限制:1秒
空间限制:32768K
美团外卖的配送员用变速跑的方式进行身体训练。
他们训练的方式是:n个人排成一列跑步,前后两人之间相隔 u 米,每个人正常速度均为 v 米/秒。
当某个配送员排在最后的时候,他需要以当时自己的最高速度往前跑,直到超过排头的人 u 米,然后降回到原始速度 v 米/秒。每个人最初的最高速度为c[i] 米/秒,每轮衰减d[i] 米/秒,也就是说,如果i是第j个跑的,那么他的速度就是c[i]-(j-1)*d[i] 米/秒。
n个人初始以随机的顺序排列,每种顺序的概率完全相等,跑完一轮(每个人都追到排头一次,序列恢复原样)的期望需要的时间是多少?
输入描述:
第一行整数n(<=1000), 实数v(<=100) , 实数u(<=10) 第二行n个实数每个人的速度c[i](<=50000) 第三行n个实数值每个人衰减量d[i](<=10) 输入数据保证每个人的速度不会衰减到<=v
输出描述:
答案保留3位小数。
输入例子:
10 37.618 0.422 72.865 126.767 202.680 106.102 99.516 134.418 167.952 173.646 120.210 136.571 2.941 3.664 7.363 4.161 0.246 8.046 5.521 7.473 7.178 5.649
输出例子:
0.815
这个追及问题的题意不太友好啊,但是看着他们一个一个过了还是有点后悔弃赛太早了。其实题目的意思就是有个人要从最后到前面的u米追及问题,速度差是c[i]-(j-1)*d[i]-v,需要追及的路程是nu。然后求下所有队列的期望
然后枚举下公式。使用rep压行感觉好爽啊,虽然不好看了,但是代码量减少不少
#include <stdio.h> #include <bits/stdc++.h> #define rep(i,x,y) for(int i=x;i<=y;++i) #define dep(i,x,y) for(int i=x;i>=y;--i) using namespace std; const int N = 1005; int n; double v,u,c[N],d[N]; int main(){ scanf("%d%lf%lf",&n,&v,&u); rep(i,1,n) scanf("%lf",c+i); rep(i,1,n) scanf("%lf",d+i); double ans = 0; rep(i,1,n) rep(j,1,n) ans+=1.0/(c[i]-(j-1)*d[i]-v); ans*=u; printf("%.3f\n",ans); }
倒水
时间限制:1秒
空间限制:32768K
有一个大水缸,里面水的温度为T单位,体积为C升。另有n杯水(假设每个杯子的容量是无限的),每杯水的温度为t[i]单位,体积为c[i]升。
现在要把大水缸的水倒入n杯水中,使得n杯水的温度相同,请问这可能吗?并求出可行的最高温度,保留4位小数。
注意:一杯温度为t1单位、体积为c1升的水与另一杯温度为t2单位、体积为c2升的水混合后,温度变为(t1*c1+t2*c2)/(c1+c2),体积变为c1+c2。
输入描述:
第一行一个整数n, 1 ≤ n ≤ 10^5 第二行两个整数T,C,其中0 ≤ T ≤ 10^4, 0 ≤ C ≤ 10^9 接下来n行每行两个整数t[i],c[i] 0 ≤ t[i], c[i] ≤ 10^4
输出描述:
如果非法,输出“Impossible”(不带引号)否则第一行输出“Possible"(不带引号),第二行输出一个保留4位小数的实数表示答案。 样例解释:往第二杯水中倒0.5升水 往第三杯水中到1升水 三杯水的温度都变成了20
输入例子:
3 10 2 20 1 25 1 30 1
输出例子:
Possible 20.0000
这个题是混合,类似于求平均值之类的,可以分成三种情况啊。
1.T 大于所有 ti:由于要求温度最大,当然是把所有水都倒完。
2.T 小于等于所有 ti:因为倒水只会把水的温度往 T 靠拢,所以找一个最小的 ti,把其他所 有 tj 都倒水变成 ti。
3.存在 ti < T 且存在 tj > T:显然无解。
然后分情况讨论就好了,当时看了一眼这个题但是也没做
记录下这些元素的最大值最小值讨论下就可以了