zoukankan      html  css  js  c++  java
  • 【NOIP模拟】挖宝藏

    题面

    Description

          小明是一位探险家,可惜一次探险摔断了腿,但这也阻止不了他探险,他发明了一个传送神器。假设小明在点(a,b),神器的传送值为(x,y),那么小明可以选择传送到(a+x,b+y),(a+x,b-y),(a-x,b+y),(a-x,b-y)中的一个,已知宝藏在点(c,d),小明想知道他能否找到宝藏。

    Input

         第一行一个整数T,表示有T组数据

        每组数据第一行四个整数a,b,c,d,表示小明的位置和宝藏的位置

        第二行两个整数x,y,表示神器的传送值。

    Output

      对于每组数据输出一行,一个YES或NO表示能否找到宝藏。

     对于30%的数据,-100 ≤ a,b,c,d ≤ 100 ,1 ≤ x, y ≤ 100

    对于100%的数据,-105 ≤ a,b,c,d ≤ 105 ,1 ≤ x, y ≤ 105,不超过100组数据

    分析

    其实第一个想到的应该是双向bfs吧。但是这题放在t1的位置,那一定是极其简单的,所以,就画图找规律

    规律其实很简单,画出来可以发现能到达的点一定是在斜率为y/x,并且截距是相对于起始点所在的直线上加减2*y个单位的直线上

    所以只需要分别判断这个点是否能在任意一条这样的直线上

    注意一下避免除法,就好了。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    int t,a,b,m,n,x,y;
    int main()
    {
        freopen("A.in","r",stdin);
        freopen("A.out","w",stdout);
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d%d%d%d%d",&a,&b,&x,&y,&m,&n);
            if(abs(a-x)%m==0&&abs(b-y)%n==0)
            {
                int am=m*b-n*a,bm=m*y-n*x;
                if(abs(am-bm)%(2*m*n)==0)
                {
                    printf("YES
    ");
                    continue;
                }    
            }
            printf("NO
    ");
        }    
        return 0;
    }
    “Make my parents proud,and impress the girl I like.”
  • 相关阅读:
    逛画展
    数的划分
    有点难度的树链刨分
    树链刨分
    记502 dp专练
    数论相关
    模拟退火
    仓鼠找sugar
    NOIP 2017 解题报告
    整体二分
  • 原文地址:https://www.cnblogs.com/NSD-email0820/p/9735106.html
Copyright © 2011-2022 走看看