LightOJ 1366 - Pair of Touching Circles (在矩形中只需要两个圆相外切,有多少种) 半径圆心均为整数)

题意:http://www.lightoj.com/volume_showproblem.php?problem=1366

利用圆心距,将各个圆心半径都模拟出来,然后找到最小矩形  最后求出总数

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<vector>
#include<math.h>
#include<string>
using namespace std;
#define INF 0x3f3f3f3f
#define LL long long
#define N 1000009
#define Lson rood<<1
#define Rson rood<<1|1
#define PI acos(-1)
int main()
{
    int T,t=1;
    scanf("%d",&T);
    while(T--)
    {
        int H,W;///求出不同圆心距时 两圆所占的最小矩形
        scanf("%d%d",&H,&W);
        LL sum=0;
        for(int i=0;i<=H/2;i++)///模拟两圆圆心 一圆心为(0,0),另一个为(i,j)
        {
            for(int j=0;j<=W/2;j++)
            {
                int d=(int)sqrt(i*i+j*j);
                if(d*d!=i*i+j*j) continue;///全为整数  圆心距也是整数
                for(int r=1;r<d;r++)
                {
                    LL ans=0;///根据半径大小 求出两圆所在的最小矩形
                    int x=max(r,i+d-r)-min(-r,i-d+r);
                    int y=max(r,j+d-r)-min(-r,j-d+r);
                    if(x>H||y>W) continue;
                    ans=(H-x+1)*(W-y+1);
                    if(i*j) ans*=2;///存在(3,4)的情况 分别为向上和向下  所以要乘2
                    sum+=ans;
                }
            }
        }
        printf("Case %d: %lld\n",t++,sum);
    }
    return 0;
}
时间: 2024-07-31 10:19:14

LightOJ 1366 - Pair of Touching Circles (在矩形中只需要两个圆相外切,有多少种) 半径圆心均为整数)的相关文章

LightOj1366 - Pair of Touching Circles(求矩形内圆的对数)

题目链接:http://lightoj.com/volume_showproblem.php?problem=1366 题意:一个H*W的矩形,现在要放入两个外切的圆,问能放多少对这样的圆,其中圆心和半径都是整数: 枚举相对的圆心坐标,根据圆心的距离,再枚举一个圆的半径: #include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> #include<cmath&

zoj 1608 Two Circles and a Rectangle 判断两个圆是否能放入一个矩形中

题目来源:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=608 分析: 两个圆放到矩形的临界点图为: 其中a为长, b为宽, r1 > r2 红色三角形的三边长分别为: x = a - (r1 +r2) y = b - (r1 + r2) z = r1 +r2 当 x ^ 2 + y ^ 2  >= z^2 时, 显然 矩形是可以放进去圆的. 代码如下: int main() { double w, l , r1 ,r2

C语言——结构体数组的使用案例(如何判断两个矩形是否相交,其中一个是否包含在另外一个里面,点是否在矩形中)

Rect.h struct CPoint { float x; float y; }; typedef struct CPoint CPoint; struct CSize { float width; float height; }; typedef struct CSize CSize; struct CRect { CPoint origin; CSize size; }; typedef struct CRect CRect; //判断两个矩形是否相交 BOOL isIntersecti

OpenCv学习笔记(七)---OpenCv中的基本绘图函数,圆,椭圆,线段,矩形,多边形的绘制(1)

(一)本节教程的目的 本节你将学到: 1--如何使用Point在图像中定义2D点 2--如何以及为何使用Scalar 3--用OpenCv的函数Line绘直线 4--用OpenCvd的函数ellipse绘制椭圆 5--用OpenCv的函数rectangle绘矩形 6--用OpenCv的函数circle绘圆 7--用OpenCv的函数fillPoly绘填充多边形 (二)原理,本节我们将大量使用Point和Scalar这两个结构: **********************************

动态规划之----我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

利用动态规划,一共有n列,若从左向右放小矩形,有两种放置方式: 第一种:横着放,即占用两列.此时第二行的前两个空格只能横着放,所有,总的放置次数变为1+num(2*(n-2)),其中2*(n-2)代表两行n-2列的矩阵 第二种:竖着放,此时有1+num(2*(n-1)),因此 利用动态规划求解 public class Solution { public int RectCover(int target) { int [] res = new int[target+1]; if(target<=

定义抽象类Shape,抽象方法为showArea(),求出面积并显示,定义矩形类Rectangle,正方形类Square,圆类 Circle,根据各自的属性,用showArea方法求出各自的面积,在main方法中构造3个对象,调用showArea方法。(体现多态)

实现多态的三个条件:1.要有继承2.要有抽象方法重写3.用父类指针(引用)指向子类对象 重载重写重定义的区别: 1.重载:在同一个类中进行; 编译时根据参数类型和个数决定方法调用; 子类无法重载父类; 父类同名方法被子类该方法覆盖. 2.重写:在父类和子类之间进行; 父类与子类方法有完全相同类型; 在运行时根据具体对象类型决定方法调用; 3.在重写中有抽象方法的会产生多态;没有使用抽象方法叫重定义 以下具体代码具体分析: package test3;abstract class Shape{ /

求出被矩形覆盖过至少两次的区域的面积(扫描线 + 线段树)

题目链接:https://vjudge.net/contest/332656#problem/J 思路: 这道题的大体的思路其实还是扫描线的思路. 就是我们要清晰之前我们所说的len 代表的是被覆盖了一次及以上次数的线段长度 为叙述方便,我们假设len[2]为当前线段被覆盖了两次的长度,len[1]为当前线段被覆盖了一次的长度,而len[0]就是这条线段的长度,并且满足len[2]+len[1]=len[0]. 首先,如果当前这条线段已经被覆盖了两次了,那么这条线段的len[2]就应该等于len

确定一组矩形是否有两个重叠的算法

注:更正一下:在英文原版书中,"请给出一个能在O(nlgn)"时间里确定一组矩形中是否有两个重叠的算法."而不是中文版的 O(lgn).因为这个问题里涉及的排序算法就至少是O(nlgn). 基本思想: 经提示用以矩形横坐标x为轴作为扫描线,从所有矩形x最小值到矩阵x最大值,当然在这之前要对所有矩形的横坐标x做一个排序,我用的是归并排序. 扫描过程如图所示的三个矩形中,从x1开始扫描,遇到矩形Gi的左x坐标,将Gi的纵坐标y的低端点和高端点组成的区间插入区间树后,判断矩阵Gi与

拖动基本实现

拖动相关事件:dragstart, drag, dragenter, dragleave, dragover, drop, dragend. 如下图,将三个圆拖动到矩形里面:   HTML结构: <div class="row"> <div class="span-6 dragTarg"></div> </div> <div class="row"> <div class=&quo