Problem E 圆环的转动问题 (14年内蒙古省赛题)

1115: Problem E 圆环的转动问题

时间限制: 1 Sec  内存限制: 128 MB

提交: 58  解决: 6

[提交][状态][讨论版]

题目描述

  已知圆环有如下特性: 1.一个转动着的圆环会带动与其相切的圆环同时转动。 2.两个相切圆环在切点处不会发生滑动。 开始时,平面上有两个静止的圆环(输入数据保证两个圆不会相交或重合)。 后加一外力,使得第一个圆环以角速度W匀速转动。   求此时第二个圆环的角速度。

输入

  输入包含多组数据。 对于每组数据: 第一行有两个整数 : X1,Y1 , R1(第一个圆环的坐标及半径) 第二行有两个整数 : X2,Y2 , R2(第二个圆环的坐标及半径) 第三行有一个整数 : W ( 第一个圆环的角速度 ,负数表示反方向转动 ) X1,Y1,X2,Y2为整数且范围在[0,10^8]内 R1,R2为整数且 0 < R1,R2 < 10^8 W为整数 且 -10^8 < W < 10^8

输出

  请输出第二个圆环的角速度,若不是整数以最简分数形式输出(参见样例)。   每组数据输出一行。

样例输入

0 0 1
2 0 1
-1
0 0 3
5 0 2
1

样例输出

1
-3/2

提示

这道题算是一道比较简单的计算几何题;第一次做的时候,忘记考虑内切的情况了,提交一直wa,开始一直也没找到什么错误;

第二次做的时候,思路已经很清晰了:

主要有三种情况:相离:圆心之间的距离大于两个半径之和的距离(小于两个半径之差)

                              外切:圆心之间的距离==两个半径之和的距离  (w2的方向和w1的方向相反)

                              内切:圆心之间的距离==两个半径之差的距离   (w2的方向和w1的方向相同)

还有就是要考虑输出形式的问题:如果可以整除就直接输出;

否则就按最简分数形式输出,(求他们之间的最大公约数,然后再输出)

第二次做的时候,代码在思路上没有问题了,但是还是wa,(更加找不到错误在哪了),后来,重新看了一遍,发现当w=0时,直接输出 0这个隐含条件一直没有处理,在判断相离的时候,添加上这个条件,a了。(坑爹啊!!)一定要注意细节的问题,以后做题一定要着重题目的思路,锻炼思维的能力!

下面是代码:

#include <cstdio>
#include <string>
#include <iostream>
#include <cmath>
typedef long long ll;
using namespace std;
ll gcd( ll a,ll b) //求最大公约数
{
    ll r;
    while(b!=0)
    {
        r=a%b;
        a=b;
        b=r;
    }
    return a;
}
ll square(ll x) //求平方
{
    return x*x;
}
ll distance(ll x1,ll y1,ll x2,ll y2) //两点之间的距离
{
    return square(x1-x2)+square(y1-y2);
}
int main()
{
    ll x1,y1,r1,x2,y2,r2,w,v1,temp;
    while(cin>>x1>>y1>>r1>>x2>>y2>>r2>>w)
    {
        v1=w*r1;
        ll dis=distance(x1,y1,x2,y2);
        if(dis>square(r1+r2) || dis<square(r1-r2) ||w==0)//相离
        {
            printf("0\n");
        }
        else if(dis==square(r1+r2))//外切
        {
            if(w>0) printf("-");
            if(v1%r2==0) printf("%lld\n",(ll)abs(v1)/r2);
            else
            {
                temp=gcd((ll)abs(v1),r2);
                printf("%lld/%lld\n",(ll)abs(v1)/temp,r2/temp);
            }
        }
        else if(dis==square(r1-r2))//内切
        {
            if(w<0) printf("-");
            if(v1%r2==0) printf("%lld\n",(ll)abs(v1)/r2);
            else
            {
                temp=gcd((ll)abs(v1),r2);
                printf("%lld/%lld\n",(ll)abs(v1)/temp,r2/temp);
            }
        }
    }
    return 0;
}
时间: 2024-08-27 02:39:07

Problem E 圆环的转动问题 (14年内蒙古省赛题)的相关文章

Problem S: 零起点学算法14——三位数反转

#include<stdio.h> #include<stdlib.h> int main() { int a,b,c,s; scanf("%d",&s); a=s/100; b=s%100/10; c=s%100%10; printf("%d%d%d",c,b,a); system("pause"); return 0; } 原文地址:https://www.cnblogs.com/chenlong991223/

hdu 1016 Prime Ring Problem DFS解法 纪念我在杭电的第一百题

Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 29577    Accepted Submission(s): 13188 Problem Description A ring is compose of n circles as shown in diagram. Put natural num

UVALive 7148 LRIP 14年上海区域赛K题 树分治

题意 n个点组成一棵树, 带有点权. 求最长不降的路径的长度, 且路径上最大值最小值之差不超过D. 显然是树分治, 但是分治之后如何维护答案呢. 假设当前重心为g, 分别记录g出发不降路径的长度,以及最大值, 和不升路径的长度以及最小值. 这里用到一个map和二分, 线段树也可以, 但是如果用线段树还要考虑负值, 再加上线段树的clear以及稍微暴力的查询.  常数大小不好说. 1 #include <bits/stdc++.h> 2 using namespace std; 3 typede

[hdu 4869](14年多校I题)Turn the pokers 找规律+拓欧逆元

Turn the pokers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 316    Accepted Submission(s): 101 Problem Description During summer vacation,Alice stay at home for a long time, with nothing to

HDU5039--Hilarity DFS序+线段树区间更新 14年北京网络赛

题意:n个点的树,每个条边权值为0或者1, q次操作 Q 路径边权抑或和为1的点对数, (u, v)(v, u)算2个. M i修改第i条边的权值 如果是0则变成1, 否则变成0 作法: 我们可以求出每个点到根节点路径边权抑或和为val, 那么ans = val等于0的个数乘val等于1的个数再乘2. 注意到每一次修改操作,只会影响以u为根的子树(假设边为u----v  dep[v] > dep[u]), 那么每次只需把子树区间的值与1抑或就行了. 这一步可以用线段树区间更新. 比赛时过的人好少

【不可能的任务14/200】bzoj1051Tarjan裸题

tarjan缩点+判断出度为0的点 所以不需要新建边 1 #include <cstdio> 2 int n,m,p,q,N=0,time=0,T=0,sum=0,ans=0; 3 int from[50001],to[50001],nex[50001],fir[10001],dfn[10001],low[10001],l[10001],tar[10001],gui[10001],c[10001]; 4 bool que[10001]; 5 void add(int p,int q){ fro

2020年3月14日 BAPC2019 比赛补题报告

Inquiry I 题意: 给定一个数列, 求公式的最大值 思路: 可以维护一个前缀和 与 后缀和, 扫描一次数组, 即可求出最大值 代码: n = int(input()) lst = [*map(int, input().split())] # left 记录数组元素平方的前缀和, right 记录数组元素后缀和 left, right = 0, sum(lst) res = 0 for i in lst: left += i**2 right -= i res = max(res, lef

ACM--数学几何--圆环的转动问题--内蒙古14年省赛

1115: Problem E 圆环的转动问题 时间限制: 1 Sec  内存限制: 128 MB 提交: 58  解决: 6 [提交][状态][讨论版] 题目描述 已知圆环有如下特性: 1.一个转动着的圆环会带动与其相切的圆环同时转动. 2.两个相切圆环在切点处不会发生滑动. 开始时,平面上有两个静止的圆环(输入数据保证两个圆不会相交或重合). 后加一外力,使得第一个圆环以角速度W匀速转动. 求此时第二个圆环的角速度. 输入 输入包含多组数据. 对于每组数据: 第一行有两个整数 : X1,Y1

Problem G 宝石合成 (内蒙古14年省赛)

1117: Problem G 宝石合成 时间限制: 1 Sec  内存限制: 128 MB 提交: 18  解决: 4 [提交][状态][讨论版] 题目描述 故事人物:豆豆强 走上致富之路的豆豆强越来越有土豪范,买房买车已经提不起他的兴趣,现在玩起了魔法宝石. 这种宝石分为不同品质等级,并且3个品质等级为 i 的宝石,可以合成一个品质等级为 i+1 的宝石.更加神奇的是,不管这个宝石的品质怎么变,一个宝石永远只占一个单位的空间. 现在豆豆强需要买一个全金打造的保险柜来储存这些宝石.本来对于他这