物理题

题目大意:现在,在理想的光滑平面上放置着一个物块。给定了 个加速阶段,每种式包含两个属性,分别为加速度与 能够维持这个加速度的时间。只有阶段结束后才能切换到下个阶段,切换的过程并不会消耗时间。数据保证加速度和时间都是正数。众所周知,物理⽼师⼀定不会轻易放过我们。他想知道,假定能任意安排阶段之间的顺序,这个物块的可能最大位移与按输入顺序进入加速的位移之差值是多少。也就是说,你需要先找到种加速的顺序使得物块位移最大,再用这个最大值减去输入顺序加速的位移,并输出这个差值

这个题目太简单了,贪心推推式子就出来了

显然得到加速度从大到小排序是最优的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1e5 + 66;

int n, v_0;
double st, ed;

struct yhzhyhm
{
int a, t;
bool operator < (const yhzhyhm &x) const
{
return a > x.a;
}
}yh[N];

signed main()
{
int i; n = read();
for (i = 1; i <= n; ++ i) yh[i].a = read(), yh[i].t = read();

for (i = 1; i <= n; ++ i)
{
st += v_0 * yh[i].t + 0.5 * yh[i].a * yh[i].t * yh[i].t;
v_0 += yh[i].a * yh[i].t;
}

sort(yh + 1, yh + 1 + n);

v_0 = 0;
for (i = 1; i <= n; ++ i)
{
ed += v_0 * yh[i].t + 0.5 * yh[i].a * yh[i].t * yh[i].t;
v_0 += yh[i].a * yh[i].t;
}

printf("%.1lf\n", ed - st);
return 0;
}