Farmer John would like to create a triangular pasture for his cows.
There are?NN?fence posts (3≤N≤1003≤N≤100) at distinct points?(X1,Y1)…(XN,YN)(X1,Y1)…(XN,YN)?on the 2D map of his farm. He can choose three of them to form the vertices of the triangular pasture as long as one of the sides of the triangle is parallel to the?xx-axis and another side is parallel to the?yy-axis.
What is the maximum area of a pasture that Farmer John can form? It is guaranteed that at least one valid triangular pasture exists.
The first line of the input contains the integer?NN. Each of the next?NN?lines contains two integers?XiXi?and?YiYi, each in the range??104…104?104…104?inclusive, describing the location of a fence post.
As the area itself is not necessarily an integer, output?two times?the maximum area of a valid triangle formed by the fence posts.
4 0 0 0 1 1 0 1 2
2
Posts at?(0,0)(0,0),?(1,0)(1,0), and?(1,2)(1,2)?form a triangle of area?11. Thus, the answer is?2?1=22?1=2. There is only one other triangle, with area?0.50.5.
Problem credits: Travis Hance
[/hide]
(Analysis by Jonathan Paulson)
This problem can be solved by brute force. We can try every triple of fence posts to see if they form a valid pasture and take the biggest. There are only?100100?posts, so there are only?10031003?- a million - triples to try. This is well within time limits (if there were over?100100?million triples to try, that would be worrying).
How do we try a triple? For a triple to be valid, one post must be the corner, another must be directly to the left or right of the corner (i.e. have the same y-coordinate as the corner), and the last must be directly up or down from the corner (i.e. have the same?xx-coordinate).
Assuming the triple forms a valid triangle, how do we find the area? That's just one-half times base times height. The base is just the difference in?xx-coordinates between the corner and second post, and the height is the difference in?yy-coordinates between the corner and third post.
So the final solution is to try all triples, and among the valid ones take the biggest area.
Implementation tips:
C++ code:
#include <iostream> #include <vector> using namespace std; using ll = long long; int main() { freopen("triangles.in", "r", stdin); freopen("triangles.out", "w", stdout); ll n; cin >> n; vector<ll> X(n, 0); vector<ll> Y(n, 0); for(ll i=0; i<n; i++) { cin >> X[i] >> Y[i]; } // i will be corner // j will be flat (same x-coordinate as i) // k will be same y-coordinate as i ll best = -1; for(ll i=0; i<n; i++) { for(ll j=0; j<n; j++) { for(ll k=0; k<n; k++) { if(Y[i]==Y[j] && X[i]==X[k]) { ll area = (X[j]-X[i]) * (Y[k]-Y[i]); if(area < 0) { area *= -1; } if(area > best) { best = area; } } } } } cout << best << endl; }
Java code (from Nick Wu):
import java.io.*; import java.util.*; public class Solution { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new FileReader("triangles.in")); PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("triangles.out"))); int n = Integer.parseInt(br.readLine()); int[] x = new int[n]; int[] y = new int[n]; for(int i = 0; i < n; i++) { StringTokenizer st = new StringTokenizer(br.readLine()); x[i] = Integer.parseInt(st.nextToken()); y[i] = Integer.parseInt(st.nextToken()); } int ret = 0; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { // same x-coordinate if(i == j || x[i] != x[j]) continue; for(int k = 0; k < n; k++) { // same y-coordinate if(i == k || y[i] != y[k]) continue; ret = Math.max(ret, Math.abs(x[k] - x[i]) * Math.abs(y[j] - y[i])); } } } pw.println(ret); pw.close(); } }
[/hide]
? 2025. All Rights Reserved. 沪ICP备2023009024号-1