• noip模拟赛 铺瓷砖


    【问题描述】
    有一面很长很长的墙。 你需要在这面墙上贴上两行瓷砖。 你的手头有两种不同尺寸的瓷
    砖, 你希望用这两种瓷砖各贴一行。瓷砖的长可以用分数表示,贴在第一行的每块瓷砖长度
    为A/B贴在第二行的每块瓷砖长度为C/D.
    本问题中你并不需要关心瓷砖的宽度。

    如上图所示, 两排瓷砖从同一起始位置开始向右排列,两排瓷砖的第一块的左端的缝隙
    是对齐的。 你想要知道, 最短铺多少距离后, 两排瓷砖的缝隙会再一次对齐。
    【输入】
    输入的第 1 行包含一个正整数 T,表示测试数据的组数。
    接下来 T 行, 每行 4 个正整数 ABCD,表示该组测试数据中,两种瓷砖的长度分别为A/B,C/D.

    【输出】
    输出包含 T 行, 第 i 行包含一个分数或整数, 表示第 i 组数据的答案。 如果答案为分数,
    则以“X/Y”的格式输出,不含引号。分数必须化简为最简形式。如果答案为整数,则输出
    一个整数 X
    【输入输出样例 1

    tile.in tile.out
    2
    1 2 1 3
    1 2 5 6
    1
    5/2


    见选手目录下的 tile/tile1.in tile/tile1.out
    【输入输出样例 1 说明】
    对于第一组数据,第一行瓷砖贴 2 块,第二行贴 3 块,总长度都为 1,即在距离起始位
    置长度为 1 的位置两行瓷砖的缝隙会再次对齐。
    对于第二组数据, 第一行瓷砖贴 5 块,第二行贴 3 块,总长度都为5/2

    分析:实际上就是求最小公倍数.分数的话先通分,然后对分子求最小公倍数就可以了,注意爆int.

    #include <map>
    #include <queue>
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    typedef long long ll;
    ll T, a, b, c, d;
    
    ll gcd(ll a, ll b)
    {
        if (!b)
            return a;
        return gcd(b, a % b);
    }
    
    int main()
    {
        scanf("%lld", &T);
        while (T--)
        {
            scanf("%lld%lld%lld%lld", &a, &b, &c, &d);
            ll t, t2;
                t = b / gcd(b, d) * d;
            a *= (t / b);
            c *= (t / d);
            t2 = a / gcd(c, a) * c;
            if (t2 % t == 0)
                printf("%lld
    ", t2 / t);
            else
            {
                ll p = gcd(t2, t);
                t /= p;
                t2 /= p;
                printf("%lld/%lld
    ", t2, t);
            }
        }
        
        return 0;
    }
  • 相关阅读:
    【HttpClient】一个http_post请求例子
    【Jenkins】Jenkins安装修改默认路径和端口的方法
    【框架】selenium运行失败后自动截图(三)
    【例子】log4j.properties例子讲解
    【配置】pom.xml的配置
    【环境】新建Maven工程步骤及报错解决方法
    【实例】去哪儿搜索实例实现
    【Java算法】获得一个随机字符串
    【Java算法】冒泡排序
    Jenkins结合testng注意事项
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7738330.html
Copyright © 2020-2023  润新知