POJ 1328(模拟&贪心_A题)解题报告

题目链接:http://poj.org/problem?id=1328

--------------------------------------------------------

题意:在平面直角坐标系上,给出多个点。寻找能覆盖的圆的最小个数。

思路:乍一看容易陷入寻找圆的圆心的思路中,然而确定圆心不是一个很容易的事情,其确定方法与其他各点都有一定关系。所以这种思路不可取。然后先从最简单的情况下考虑,如果纵坐标大于圆的半径,那么无论何种方式都不能满足题意,所以输出"-1"。由此获得启发,计算出每个点在y轴上的可行区间,然后判断区间是否有重合的地方。如果重合,圆心可以放置再重合区间内,更新区间,直至每个区间都进行了判断。

注意:1.提交时候出现了CE,注重代码习惯,减少C、C++混合coding方式

2.本题的输入数据注意边界点(半径为0,圆心位于y轴下方),虽然本题测评时没有出现相关数据。

3.本题输入数据类型有可能为double型,样例都为int型,容易产生惯性思维,认为都为int型,要开double。

代码:

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<map>
using namespace std;
int N =0;
int d =0;
    const int n=1010;
    double A[n+5];double B[n+5];
    double L[n+5];double H[n+5];

int main(void){
    int c1 =0;
    while(scanf("%d%d",&N,&d)){
    int flag = 1;
    if(N==0&&d==0)    break;
    for(int i=0;i<N;i++){
        scanf("%lf %lf",&A[i],&B[i]);
        if(B[i]>d||B[i]<0||d<=0) flag = 0;
    }
    for(int j=0;j<N;j++){
        L[j]=A[j]-sqrt(double(d*d-B[j]*B[j]));
        H[j]=A[j]+sqrt(double(d*d-B[j]*B[j]));
    }
    int num =1;
    for(int i=0;i<N;i++){
        for(int j=i+1;j<N;j++){
            if(L[i]>L[j]){
                double tmp =L[i];
                L[i]=L[j];
                L[j]=tmp;
                tmp=H[i];
                H[i]=H[j];
                H[j]=tmp;
            }
        }
    }

    double ss=L[0];
    double st=H[0];
    for(int i=1;i<N;i++){
        if(L[i]<=st){
            if(H[i]<st)    st=H[i];
        }else{
            st=H[i];
            num++;
        }
    }

    c1++;
    if(flag)    printf("Case %d: %d\n",c1,num);
    else    printf("Case %d: %d\n",c1,-1);
    }
    return 0;

}

原文地址:https://www.cnblogs.com/caomingpei/p/8325159.html

时间: 2024-10-10 05:12:06

POJ 1328(模拟&贪心_A题)解题报告的相关文章

08年acm区域赛北京赛区 部分题解题报告

08年区域赛北京赛区 http://poj.org/searchproblem?field=source&key=Beijing+2008 POJ 3921 Destroying the bus stations 题目还是比较难的,当时的榜似乎只有4/25的通过/提交,其实题目数据很水.学长转换模型写了网络流求最小割,可以AC,不过自己造了个数据推翻了正确性.我写了个很挫的bfs套bfs,外层是最小的删除点数,内层是求最短路,数据很水可以AC.但比较蛋疼的在于bfs耗内存,而且队列中的点数是阶乘

2019模拟赛09场解题报告

目录 2019模拟赛09场解题报告 目录la~~ 题一:瞬间移动 题二:食物订购 题三:马蹄印 题四:景观美化 2019模拟赛09场解题报告 标签(空格分隔): 解题报告 Forever_chen 2019.8.20 目录la~~ 题一:瞬间移动 [题面] 有一天,暮光闪闪突然对如何将一个整数序列a1,a2,...,an排序为一个不下降序列起了兴趣.身为一只年轻独角兽的她,只能进行一种叫做"单元转换"(unit shift)的操作.换句话说,她可以将序列的最后一个元素移动到它的起始位置

最小生成树,POJ和HDU几道题目的解题报告(基于自己写的模板)

首先POJ题目: 链接:1251 Jungle Roads 题目大意:纯求最小生成树,结果为最小权值边的和.采用邻接表 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <queue> 5 using namespace std; 6 7 #define maxn 30 //最大顶点个数 8 int n; //顶点数,边数 9 10 struct arcn

poj 1094 Sorting It All Out 解题报告

题目链接:http://poj.org/problem?id=1094 题目意思:给出 n 个待排序的字母 和 m 种关系,问需要读到第 几 行可以确定这些字母的排列顺序或者有矛盾的地方,又或者虽然具体的字母顺序不能确定但至少不矛盾.这些关系均是这样的一种形式: 字母1 < 字母2 这道题目属于图论上的拓扑排序,由于要知道读入第几行可以确定具体的顺序,所以每次读入都需要进行拓扑排序来检验,这时每个点的入度就需要存储起来,所以就有了代码中memcpy 的使用了. 拓扑排序的思路很容易理解,但写起来

圆锥曲线:椭圆小题解题报告

圆锥曲线:椭圆小题解题报告 注意事项: 由于本人水平有限,部分题目解题方法可能非最优解,如有更好方法欢迎在评论区指正. 部分题目讲解可能过于口语化,导致并不符合官方(人教版教材)的要求,请各位在考试中不要学习,使用正确的,符合要求的用语. 本文中可能存在错别字,望发现者在评论区指正. 本篇博客是为记录本人在完成学校作业的过程中遇到的问题,同时给部分同学作为解题参考用. 本篇博客中绘制图像的工具是geogebra. 1~10题: 1 题目: 已知F~1~,F~2~是椭圆\(x^2/4+y^2/3=

2016.8.27一套简单的题解题报告

一套不错的题,需要相关资料的联系我咯 考试分析: 1.  由于题目的名字加上第一道题没读完时我以为是我最不擅长的treeDP(其实不得不说,树和图上的题我真的是不想写,一般都写不对,上课太不认真,这个弱点要加强训练),我直接跳到了最后一道题,明知考3h还用了30min去分析,不过还是感谢,这30min救了我两道题出来: 这套题的确还是比较简单,后两道题只要认真分析数据都不会有问题,也许是因为暑假切了贪心和递推,我对分析数据比较在行,第三题切完之后还有2h,不过没写高精的我有点慌,打算最后留一点时

POJ 2260(模拟&amp;贪心_B题)解题报告

题目链接:http://poj.org/problem?id=2260 -------------------------------------------------------- 题意:一种校验码,查出一位的比特差错. 思路:校验码的原理与思路很明确,计算出每行每列的和,找出该和为奇数的点,该点所对应的x,y坐标即为所求.超过两位输出"Corrupt". 代码: #include<cstdio> #include<iostream> using names

CodeForces 825B(模拟&amp;贪心_D题)解题报告

题目链接:http://codeforces.com/problemset/problem/825/B -------------------------------------------------------------------------------- 题意:五子棋,在输入条件下,能否在当前局面获胜. 思路:很明显的是,当我们下五子棋时,我们每步都是进行一次搜索,观察能否连接成为5个.同理,利用计算机也可以向各个方向进行搜索.好在本题只是10X10的棋面,直接对每个点进行4个方向(水

Codeforces Round #256 (Div. 2/A)/Codeforces448A_Rewards(水题)解题报告

对于这道水题本人觉得应该应用贪心算法来解这道题: 下面就贴出本人的代码吧: 1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 5 int a[3],b[3]; 6 7 int main(void) 8 { 9 int n; 10 int need = 0; 11 int sum1 = 0,sum2 = 0; 12 for(int i=1;i<=3;++i){ 13 scanf("%d&q