problem-1001
来源:互联网 发布:网络安全工程师学习 编辑:程序博客网 时间:2024/06/05 18:40
题义:给定若干(1<= n <=5000)组二维坐标点,凡是满足 "x1<= x2 && y1<= y2"的话那么我们承认这两个坐标是属于同一个集合中。题目要我们求出这些坐标点最少能表示成几个集合。先将所有的点的信息保存起来,然后选取 x 或者 y 作为对象进行排序,排序中注意如果两个点的 x相同,那么这时候要保持 y有序。这样做的目的是使得所有集合线性的呈现出来,可以理解为经过这样一次排序后,能够每次从前到后找到一个包含点满足题义且最多的点集。不会出现正确分离出来的集合在该排列中有元素是逆序的。
代码:
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;struct T{ int w,l;}a[5010];bool cmp(T a,T b){ if(a.l==b.l) return a.w<b.w; return a.l<b.l;}bool vis[5010];int main(){ int cas; scanf("%d",&cas); while(cas--) { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",&a[i].l,&a[i].w); sort(a,a+n+1,cmp); memset(vis,0,sizeof(vis)); int num=1;//从num开始找 int w,l; int count=0,tt=0; while(tt<n) { vis[num]=1; tt++; w=a[num].w; l=a[num].l; bool flag=false; for(int i=num+1;i<=n;i++) if(!vis[i]&&a[i].l>=l&&a[i].w>=w) { w=a[i].w; l=a[i].l; vis[i]=1; tt++; } else if(!vis[i]&&!flag) { flag=true; num=i; } count++; } printf("%d\n",count); } return 0;}
0 0
- Problem - 1001: Sum Problem
- Problem - 1001 Sum Problem
- Problem - 1001_Sum Problem
- Problem 1001
- Problem 1001
- problem-1001
- Problem 1001
- Problem-1001
- 【HDOJ】 <Problem - 1001> : Sum Problem
- 西安电子Problem 1001 A+B Problem
- ZOJ Problem Set - 1001||A + B Problem
- 1001 Problem B && 1008 Problem I
- 1001 A + B Problem
- 1001 Sum Problem.
- [HUD 1001]Sum Problem
- 1001 Sum Problem
- 1001 Sum Problem
- 1001:Sum Problem
- caffe源码分析:blob.hpp分析
- 据说是新浪乐居的面试题及我的答案以及对笔试题的一些建议
- Support Library最新8个组件(Material Design设计风格:design support library)
- ExtJs布局详解
- 关于ListView的HeaderView
- problem-1001
- 开源电商平台OFBiz第一章初识OFBiz
- 天声人語 20160328 四国新幹線のゆくえ
- 解决如何在谷歌浏览器下定义小于12px的字体的问题
- 知识点
- Struts2学习总结01
- iOS开发完全自学资源集合
- javascript中return的作用
- 堆内存溢出原因