Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 65881 | Accepted: 14767 |
Description
Input
Output
Sample Input
3 2 1 2 -3 1 2 1 1 2 0 2 0 0
Sample Output
Case 1: 2Case 2: 1
区间覆盖问题,想了好久,根据所给的坐标判断在x轴上的覆盖范围,排序,然后用贪心思想解决。
#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<ctype.h> #include<stdlib.h> #include<string> #include<algorithm> #include<vector> #include<set> #include<map> #include<list> #include<queue> #include<stack> #include<iomanip> #include<numeric> #include <istream> //基本输入流 #include <ostream> //基本输出流 #include <sstream> //基于字符串的流 #include <utility> //STL 通用模板类 #include <complex.h> //复数处理 #include <fenv.h> //浮点环境 #include <inttypes.h> //整数格式转换 #include <stdbool.h> //布尔环境 #include <stdint.h> //整型环境 #include <tgmath.h> //通用类型数学宏 #define L(a,b,c) for(int a = b;a >= c;a --) #define M(a,b,c) for(int a = b;a < c;a ++) #define N(a,b) memset(a,b,sizeof(a)); const int INF=1<<31; const int inf=-INF; typedef int T; typedef double D; typedef char C; using namespace std; struct node { double x; double y; } s[1010],temp; bool comp (node x,node y) { return x.x<y.x; } int main() { int n,num=0; double a,b; double r; while(~scanf("%d%lf",&n,&r)) { if(n==0&&r==0) break; bool flag=0; M(i,0,n) { cin>>a>>b; if(fabs(b)>r) ///若大于r,则说明该点不能被覆盖 flag=1; else { s[i].x=a*1.0-sqrt(r*r-b*b); s[i].y=a*1.0+sqrt(r*r-b*b); } } printf("Case %d: ",++num); if(flag) { printf("-1\n"); } else { ///贪心思想 int count=1; sort(s,s+n,comp); temp=s[0]; M(i,1,n) { if(temp.y<s[i].x) { ++ count; temp=s[i]; } else temp.y=min(temp.y,s[i].y); ///找出覆盖的最小区间 } printf("%d\n",count); } } return 0; }