水题 I, 此题太水,10分钟1A,手速不够。
看了kuangbin的博客,发现kuangbin在结构体里面写了共有函数。就像类一样。这样可以简化一点代码。。。
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <string>
#include <cstring>
#include <cmath>
#include <vector>
#include <map>
using namespace std;
struct Node
{
double t;
double x, y;
void input()
{
cin >> t >> x >> y;
}
double calc(Node b)
{
return hypot(x - b.x, y - b.y) / (b.t - t);
}
}node[1005];
int main()
{
int t; cin >> t;
while (t--)
{
int n; cin >> n;
int i;
for (i = 0; i < n;++i)
{
node[i].input();
}
double ans = 0;
for (i = 0; i <n - 1; ++i)
{
double temp = node[i].calc(node[i + 1]);
ans = max(ans,temp);
}
cout << fixed << setprecision(10);
cout << ans << endl;
}
return 0;
}
水题 D。。。
虽然是水题,但是,我没有做出来。。。
首先,我开始的时候以为行星只能移动到一个整数位置,导致我连sample output 都没有搞出来。。。
后来,看了大牛的博客,才把位置由 int 改成 double
总体思路:这道题先需要排序,取连续的片段 m = n-k ,把剩余的 k部分(也就是移动的部分)移动到 n-k的中心(可能是double)。这样,那移动的k部分的 inertia 就是 0。
为什么可以像这样取一段连续长度为n-k的片段,而不是随机取,记得应该是高中有一个什么排序不等式定理之类的公式。
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <string>
#include <cstring>
#include <cmath>
#include <vector>
#include <map>
using namespace std;
const int MAX = 50005;
double pos[MAX], sum1[MAX], sum2[MAX];
int main()
{
int t; cin >> t;
while (t--)
{
int n, k;
cin >> n >> k;
sum1[0] = 0;
sum2[0] = 0;
int i;
for (i = 1; i <= n;++i)
{
scanf("&lf", &pos[i]);
//cin >> pos[i];
}
if (n==k)
{
cout << 0 << endl;
continue;
}
sort(pos + 1, pos + 1 + n);
for (i = 1; i <= n;++i)
{
sum1[i] = sum1[i - 1] + pos[i];
sum2[i] = sum2[i - 1] + pos[i] * pos[i];
}
int m = n - k;
double ans = 2e100;
for (i = m; i <= n;++i)
{
double center = (sum1[i] - sum1[i - m]) / m;
double temp = sum2[i] - sum2[i - m] + m*center*center - 2 * center*(sum1[i] - sum1[i - m]);
ans = min(temp, ans);
}
cout << fixed << setprecision(10);
cout << ans << endl;
}
return 0;
}