洛谷八连测2017R5
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷八连测2017R5相关的知识,希望对你有一定的参考价值。
传送门
题目描述
题目难度不一定按照题目顺序递增
在 n * mn?m 的网格上有一些点。在第 ii 行第 jj 列放置摄像头可以观察到所有满足 x = i, y \\geq jx=i,y≥j 或x \\geq i, y = jx≥i,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的主要内容,如果未能解决你的问题,请参考以下文章