東大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
	 */


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章