題目描述
給出平面上的n個點,請找出乙個邊與座標軸平行的矩形,使得它的邊界上有盡量多的點
輸入輸出格式
輸入格式:
第一行乙個整數n,為平面內點的個數。
第2~n+1行每行兩個整數,為點的橫、縱座標。
輸出格式:
只有乙個數,為所取矩形邊界上能包含盡量多的點的個數。
輸入輸出樣例
輸入樣例#1:
10 2 3
9 2
7 4
3 4
5 7
1 5
10 4
10 6
11 4
4 6
輸出樣例#1:
7 說明
【資料範圍】
對於40%的資料,n<=30
對於100%的資料,n<=300,各點的橫、縱座標在1~100範圍內
此題應該是一道略有思維難度的題,涉及到數學邏輯思維的運用,對矩形的構造需要一定的想象能力。
要點:1、列舉兩個點,把他們作為矩形上兩個相對的頂點,構建矩形;
2、特判所有點在一條直線上的情況,此時輸出點的個數;
3、在兩個點外另找乙個點,分作矩形邊界點和矩形內部點兩種情況,記下此時矩形邊上點的個數、矩形內部點的個數、矩形內部加邊上點的個數,最後比較出最大值即可。
#include
#include
#include
#include
#include
#include
using
namespace
std;
struct dd
a[310];
int on[110],in[110],l[110],num[110],i,j,k,n,ans=0;
int main()
if(x1||y1)//所有點橫座標或縱座標全相同的情況
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i].y>=a[j].y)//保證a[i].ycontinue;
else
if(a[k].y>a[i].y&&a[k].y//a[k].y在a[i].y與a[j].y之間時
}l[1]=0;
for(k=2;k<=100;k++)
l[k]=l[k-1]+num[k-1];//當a[k]作為邊上點時矩形內點的個數
int max0=on[1]-l[1];
for(k=2;k<=100;k++)//當a[k]作為矩形中間點時矩形內點的個數
}cout
0;}
洛谷P1191 矩形
給出乙個n n的矩陣,矩陣中,有些格仔被染成白色,有些格仔被染成黑色,現要求矩陣中白色矩形的數量 輸入格式 第一行,乙個整數n,表示矩形的大小。接下來n行,每行n個字元,這些字元為 w 或 b 其中 w 表示白格,b 表示黑格。輸出格式 乙個正整數,為白色矩形數量 輸入樣例 1 4 wwbw bbw...
洛谷P1191 矩形
給出乙個n nn times nn n的矩陣,矩陣中,有些格仔被染成白色,有些格仔被染成黑色,現要求矩陣中白色矩形的數量 輸入格式 第一行,乙個整數nnn,表示矩形的大小。接下來nnn行,每行nnn個字元,這些字元為 www 或 bbb 其中 www 表示白格,bbb 表示黑格。輸出格式 乙個正整數...
洛谷P1034矩形覆蓋
據說是dp,所以我用dfs,居然a了,資料真水 說說思路,我們要求覆蓋所有點且不能重疊,顯然我們要從點入手,我們可以列舉每個點被哪個矩形重疊,因為如果列舉矩形覆蓋點的話,貌似不可做,具體怎麼實現呢?最好小夥伴們手動畫個圖,一下就明白了,列舉每個點被哪個矩形覆蓋,那麼必然是要根據點的座標來調整矩形的位...