1. 程式人生 > >洛谷八連測2017R5

洛谷八連測2017R5

def tdi http 大小 radi psu sizeof math return

傳送門

題目描述

題目難度不一定按照題目順序遞增

n * mn?m 的網格上有一些點。在第 ii 行第 jj 列放置攝像頭可以觀察到所有滿足 x = i, y \geq jx=i,yj 或x \geq i, y = jxi,y=j的點。求最少需要放多少個攝像頭才能觀察到所有給定的點,註意攝像頭必須放在點上,且要保證任意一個攝像頭均不能觀察到另一個攝像頭。保證輸入中的點不會重復。

輸入輸出格式

輸入格式:

第一行包含一個整數 TT,表示數據組數。每組數據的格式如下:

第一行包含三個正整數 n, m, qn,m,q,表示網格的大小和給定點的個數。

接下來 qq 行,每行兩個整數 x_i, y_ixi?,yi? ,表示第 ii 個點的坐標。

輸出格式:

對每組數據輸出一行,表示最少放置攝像頭的點數,如果無解輸出-1。

輸入輸出樣例

輸入樣例#1: 復制
1
2 4 4
1 1
2 1
2 3
2 4
輸出樣例#1: 復制
2
技術分享

貪心
 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<map>
 7 #include<set>
 8 #include<queue>
 9
#include<vector> 10 #define INF 0x7f7f7f7f 11 #define pii pair<int,int> 12 #define ll long long 13 #define MAXN 100005 14 using namespace std; 15 16 int read(){ 17 int x=0,f=1;char ch=getchar(); 18 while(ch<0||ch>9){if(-==ch)f=-1;ch=getchar();} 19 while(ch>=0&&ch<=
9){x=x*10+ch-0;ch=getchar();} 20 return x*f; 21 } 22 int n; 23 pii a[MAXN]; 24 int H[MAXN],L[MAXN]; 25 void solve(){ 26 memset(H,0,sizeof(H)); 27 memset(L,0,sizeof(L)); 28 int X=read(),Y=read(); 29 n=read(); 30 for(int i=1;i<=n;i++){ 31 a[i]=make_pair(read(),read()); 32 } 33 sort(a+1,a+n+1); 34 int ans=0; 35 for(int i=1;i<=n;i++){ 36 if(H[a[i].first]||L[a[i].second]){ 37 continue; 38 } 39 ans++; 40 H[a[i].first]=1; 41 L[a[i].second]=1; 42 } 43 printf("%d\n",ans); 44 } 45 int main() 46 { 47 // freopen("data.in","r",stdin); 48 int T=read(); 49 while(T--){ 50 solve(); 51 } 52 return 0; 53 }

洛谷八連測2017R5