东大OJ-Max Area

1034: Max Area

时间限制: 1 Sec   内存限制: 128 MB
提交: 40   解决: 6
[ 提交][ 状态][ 讨论版]

题目描述

又是这道题,请不要惊讶,也许你已经见过了,那就请你再来做一遍吧。这可是wolf最骄傲的题目哦。在笛卡尔坐标系正半轴(x>=0,y>=0)上有n个点,给出了这些点的横坐标和纵坐标,但麻烦的是这些点的坐标没有配对好,你的任务就是将这n个点的横坐标和纵坐标配对好,使得这n个点与x轴围成的面积最大。

输入

在数据的第一行有一个正整数m,表示有m组测试实例。接下来有m行,每行表示一组测试实例。每行的第一个数n,表示给出了n个点,接着给出了n个x坐标和y坐标。(给出的x轴的数据不会重复,y轴数据也不会重复)(m<5000,1<n<50) div="" y5<="" y4="" y3="" y2="" y1="" x5="" x4="" x3="" x2="" x1="" 5="" 4="" 2="" 如:="">

输出

输出所计算的最大面积,结果保留两位小数,每组数据占一行。

样例输入

2
4 0 1 3 5 1 2 3 4
6 14 0 5 4 6 8 1 5 6 2 4 3

样例输出

15.00
59.00


#include<stdio.h>
void sort(double *a, int from, int to){
	if (to <= from)return;
	int i = from, j = to;
	double k = a[from];
	while (1){
		while (a[j] > k)j--;
		if (j == i)break;
		a[i] = a[j];
		a[j] = k;
		i++;
		while (a[i] < k)i++;
		if (j == i)break;
		a[j] = a[i];
		a[i] = k;
		j--;
	}
	sort(a, from, i - 1);
	sort(a, i + 1, to);
}
int main()
{
	//freopen("in.txt", "r", stdin);
	int t;
	scanf("%d", &t);
	while (t-- > 0){
		int n;
		scanf("%d", &n);
		double x[5001];
		double  y[5001];
		double z[5001];
		int i;
		for (i = 0; i < n; i++)scanf("%lf", &x[i]);
		for (i = 0; i < n; i++)scanf("%lf", &y[i]);
		sort(x, 0, n - 1);
		for (i = 1; i < n - 1; i++)
			z[i] = x[i + 1] - x[i - 1];
		z[0] = x[1] - x[0];
		z[n - 1] = x[n - 1] - x[n - 2];
		sort(z, 0, n - 1);
		sort(y, 0, n - 1);
		double ans = 0;
		for (i = 0; i < n; i++)
			ans +=  z[i] *  y[i];
		printf("%.2lf\n", ans / 2);
	}
	return 0;
}
/*破东大OJ题里没说清楚,点是double类型,那个m是5000可能.
  若问这道题怎么做,
  第一关,走两步,列出式子;
  第二关,必须知道一个不等式:
     顺序>乱序>逆序
	 例如:a={1,2,3}b={4,5,6}
	 则1*4+2*5+3*6>乱序>1*6+2*5+1*4
	 */


转载于:https://www.cnblogs.com/weiyinfu/p/5013902.html

SDUT-OJ(Software Development University of Tsinghua Online Judge)是一个在线编程平台,提供给清华大学软件学院的学生和爱好者练习和解决算法问题的环境,其中包括各种计算机科学题目,包括数据结构、算法、图形等。对于"最小生成树"(Minimum Spanning Tree, MST)问题,它是图论中的经典问题,目标是从一个加权无向图中找到一棵包含所有顶点的树,使得树的所有边的权重之和最小。 在C语言中,最常见的是使用Prim算法或Kruskal算法来求解最小生成树。Prim算法从一个顶点开始,逐步添加与当前生成树相连且权重最小的边,直到所有顶点都被包含;而Kruskal算法则是从小到大对所有边排序,每次选取没有形成环的新边加入到树中。 如果你想了解如何用C语言实现这些算法,这里简单概括一下: - 通常使用优先队列(堆)来存储边和它们的权重,以便快速查找最小值。 - 从任意一个顶点开始,遍历与其相邻的边,若新边不形成环,就更新树,并将新边加入优先队列。 - Kruskal算法: - 先将所有的边按照权重升序排序。 - 创建一个空的最小生成树,然后依次取出排序后的边,如果这条边连接的两个顶点不在同一个连通分量,则将其添加到树中。 如果你需要更详细的代码示例,或者有具体的问题想了解(比如如何处理环、如何实现优先队列等),请告诉我,我会为你提供相应的帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值