Java练习 SDUT-2401最大矩形面积
最大矩形面積
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
在一個(gè)矩形區(qū)域內(nèi)有很多點(diǎn),每個(gè)點(diǎn)的坐標(biāo)都是整數(shù)。求一個(gè)矩形,使之內(nèi)部沒(méi)有點(diǎn),且面積最大。所求矩形的邊與坐標(biāo)軸平行。
Input
一個(gè)整數(shù)t,表示測(cè)試組數(shù)。
整數(shù)l,w表示矩形橫向邊長(zhǎng)和豎向邊長(zhǎng)。
一個(gè)整數(shù)n,表示該矩形內(nèi)點(diǎn)的個(gè)數(shù)。
n個(gè)點(diǎn)的坐標(biāo)x,y。
Output
最大面積。
Sample Input
2
2 3
0
10 10
4
1 1
9 1
1 9
9 9
Sample Output
6
80
題解:這道題是一道偏向思維的題目,先讓點(diǎn)從左往右跑一邊然后從上往下跑一邊找出最大的矩形面積。注意邊界的更新,需要讓這個(gè)點(diǎn)再邊界內(nèi)部,一開(kāi)始 我想的是根據(jù)面積最小的損失來(lái)更新這個(gè)點(diǎn),結(jié)果后來(lái)意識(shí)到,比如一個(gè)點(diǎn)的x坐標(biāo)7,此時(shí)的左右邊界的值跟新為(0,6),這個(gè)點(diǎn)就不再范圍內(nèi)了,這樣就導(dǎo)致該點(diǎn)不再所求的矩形的邊上,然而循環(huán)求的意義在于求與這個(gè)點(diǎn)有關(guān)的矩形的面積(點(diǎn)在矩形邊上)。
import java.util.*;public class Main {public static void main(String []args){Scanner cin = new Scanner(System.in);int t,i,lr,ud;node a = new node();t = cin.nextInt();while(t-->0){a.l = cin.nextInt();a.w = cin.nextInt();a.n = cin.nextInt();a.INIT();//System.out.println(a.n);for(i=2;i<a.n;i++){a.s[i].x = cin.nextInt();a.s[i].y = cin.nextInt();}lr = a.get_lr();ud = a.get_ud();System.out.println(Math.max(lr, ud));}cin.close();} }class point {int x,y; } /*具體的解題代碼*/ class node {int l,w,n;point s[] = new point[1050];/*初始化,讓邊界成為一個(gè)點(diǎn)(最大的矩形面積)*/void INIT(){int i;n = n + 2;for(i=0;i<n;i++)s[i] = new point();s[0].x = 0;s[0].y = 0;s[1].x = l;s[1].y = w;}/*根據(jù)x的大小對(duì)點(diǎn)進(jìn)行排序*/void sortlr(){int i,j;point t = new point();for(i=0;i<n;i++){for(j=0;j<n-i-1;j++){if(s[j].x>s[j+1].x){t = s[j];s[j] = s[j+1];s[j+1] = t;}else if(s[j].x==s[j+1].x){if(s[j].y>s[j+1].y){t = s[j];s[j] = s[j+1];s[j+1] = t;}}}}}/*根據(jù)y的大小對(duì)點(diǎn)進(jìn)行排序*/void sortud(){int i,j;point t = new point();for(i=0;i<n;i++){for(j=0;j<n-i-1;j++){if(s[j].y>s[j+1].y){t = s[j];s[j] = s[j+1];s[j+1] = t;}else if(s[j].y==s[j+1].y){if(s[j].x>s[j+1].x){t = s[j];s[j] = s[j+1];s[j+1] = t;}}}}}/*從左往右尋找最大的矩形面積*/int get_lr(){int ans = 0,i,j,du,dd;sortlr();for(i=0;i<n-1;i++){du = w;dd = 0;for(j=i+1;j<n;j++){if(s[i].x!=s[j].x){ans = Math.max(ans, (s[j].x-s[i].x)*(du-dd));/*更新上下邊界,注意讓此時(shí)的點(diǎn)在邊界范圍內(nèi)(即該點(diǎn)在矩形的邊上)*/if(s[j].y>s[i].y)du = Math.min(du, s[j].y);elsedd = Math.max(dd,s[j].y);}}}return ans;}/*從下往上找最大的矩形面積*/int get_ud(){int ans = 0,i,j,dl,dr;sortud();for(i=0;i<n-1;i++){dl = 0;dr = l;for(j=i+1;j<n;j++){if(s[i].y!=s[j].y){ans = Math.max(ans, (s[j].y-s[i].y)*(dr-dl));/*更新上下邊界*/if(s[j].x>s[i].x)dr = Math.min(dr, s[j].x);elsedl = Math.max(dl, s[j].x);}}}return ans;} }轉(zhuǎn)載于:https://www.cnblogs.com/luoxiaoyi/p/9870238.html
總結(jié)
以上是生活随笔為你收集整理的Java练习 SDUT-2401最大矩形面积的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: springcloud 实战 feig
- 下一篇: Java IO框架总揽--ObjectI