【問題描述】
在乙個平面上,如果有兩個點(x,y),(a,b),如果說(x,y)支配了(a,b),這是指x>=a,y>=b;用圖形來看就是(a,b)坐落在以(x,y)為右上角的乙個無限的區域內。
給定n個點的集合,一定存在若干個點,它們不會被集合中的任何一點所支配,這些點叫做極大值點。請程式設計找出所有的極大點,按照x座標由小到大,輸出極大點的座標。
【輸入格式】
輸入包括兩行,第一行是正整數n,表示是點數,第二行包含n個點的座標,座標值都是整數,座標範圍從0到100,輸入資料中不存在座標相同的點。
【輸出格式】
按x軸座標最小到大的順序輸出所有極大點。輸出格式為:(x1,y1),(x2,y2),…(xk,yk),按x由小到大,x相同則按y由小到達輸出。注意:輸出的每個點之間有」,」分隔,最後乙個點之後沒有」,」,少輸出和多輸出都會被判。
【輸入樣例】
5 1 2
2 2
3 1
2 3
1 4【輸出樣例】
(1,4),(2,3),(3,1)
【樣例解釋】
【資料範圍】
80%的資料滿足:n<=6000
100%的資料滿足:n<=100000
若是用暴力查詢,只能通過80%的資料。要想ac,則需要優化。可以考慮把x排序再查詢,這時就有很多種優化選擇。一種做法是dp查詢y值的下降子串行,為子串行開頭的元素所屬點一定是極大點。更簡單的做法就是直接從x排序後的最後乙個元素向前找y的值,如果當前y的值大於之前找到的y值,那麼當前這個點一定是極大點。時間複雜度為n*log2n。
#include
#include
#include
#include
using
namespace
std;
const
int maxn=100002;
int n;
struct data
;data a[maxn];
vector
g;bool cmp(data a,data b)
return t;
}int main()
sort(a+1,a+n+1,cmp);
int max=-1,p=0,q=0;
for(int i=n;i>=1;i--));}
}for(int i=g.size()-1;i>=0;i--)
printf(",");
}return
0;}
openjudge 數字統計
總時間限制 1000ms 記憶體限制 100000kb 描述輸入n個整數,統計每個數出現的次數.輸入 第一行是乙個整數n 1 n 1000 接下來n行每行乙個整數.輸出 第一行輸出總共有多少個不同的整數.接下來每行輸出乙個整數及這個整數出現的次數,用空格分隔.輸出的整數的順序與它們在輸入中第一次出現...
Openjudge 括號匹配
這個用了普通的迴圈,資料量不是很大的話效率還是不錯的,如果資料比較大的話,換別的方法可能效率會高一點。思路很簡單 以字串中是否還存在沒有匹配過的 作為這個字串已經處理完畢的標誌。1,讀入字串,並進行處理,把所有不是 和 的字元都轉換成空格。2,從開始掃瞄字串,如果掃瞄到 記錄 的位置,直到掃瞄到 3...
openjudge 移動路線
描述 桌子上有乙個m行n列的方格矩陣,將每個方格用座標表示,行座標從下到上依次遞增,列座標從左至右依次遞增,左下角方格的座標為 1,1 則右上角方格的座標為 m,n 小明是個調皮的孩子,一天他捉來乙隻螞蟻,不小心把螞蟻的右腳弄傷了,於是螞蟻只能向上或向右移動。小明把這只螞蟻放在左下角的方格中,螞蟻從...