鞍山赛区的两道水题

水题 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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值