zoukankan      html  css  js  c++  java
  • 刷题总结——(一道很妙的题)Resistance(ssoj 欧几里得 )

    题解:

    题目背景

    151006 T1

    题目描述

    Picks 喜欢电路。这天他在研究元电路的时候,需要一个阻值为 (p/q)Ω 的电阻,然而他家中只有一大堆电阻为 1Ω 电阻。由于技术问题,Picks 每次只能把一个电阻串联或并联进整个电路。而 Picks 拿着这么大一堆电阻觉得很浪费,于是他找到你,希望你能告诉他最少用多少个电阻才能拼出他所需要的电阻。

    输入格式

    输入一行,为两个正整数 P 和 Q 。

    输出格式

    输出一行一个整数,即最少要用的电阻个数。

    样例数据 1

    输入  [复制]

    3 2

    输出

    3

    备注

    【样例说明】
    要得到一个 (3/2)Ω 的电阻,可以用两个电阻并联,再串联一个电阻。

    【数据范围】
    30% 的数据:1≤P,Q≤10;
    100% 的数据:1≤P,Q≤1018。

    题解:

    引用ssoj官网题解:

    考虑现在我们的电阻为 a/b Ω,串联一个电阻上去,电阻变为(a+b)/b Ω.
    并联一个电阻上去,电阻变为 a/(a+b) Ω 。

    假设我们需要的电阻为 P/Q Ω,每次我们都能将 P 减小到比 Q 小,也能将 Q 减小到比 P 小。

    那么,我们能进行的操作为:P/Q Ω → (P mod Q)/Q Ω 或 P/Q Ω → P/(Q mod P) Ω

    这样的最优性是显然的。

    考虑这个操作,会发现和 Euclid(欧几里得) 算法的步骤很接近。由于 Euclid 算法的复杂度为O(logN),故此方法也是。

    时间复杂度:O(logN),空间复杂度:O(1)。

    其实这道题和欧几里得的思想并没有太大关系···只是形式上一样···以后遇到数论题要多推一下式子···

    代码:

    #include <stdio.h>
    #ifdef WIN32
    #define OTL "%I64d"
    #else
    #define OTL "%lld"
    #endif
    #define ll long long
    ll p, q, ans;
    
    void Deal( ll p, ll q ) {
        if ( q == 0 ) return;
        ans += p / q;
        Deal( q, p % q );
    }
    
    int main() {
        //freopen( "resistance.in", "r", stdin );
        //freopen( "resistance.out", "w", stdout );
        scanf( OTL OTL, &p, &q );
        Deal( p, q );
        printf( OTL, ans );
        return 0;
    }
  • 相关阅读:
    Python的list、tuple、dict常用方法
    Linux和windows下安装python
    Python数据类型一
    pycharm设置
    Python流程控制条件语句和循环语句
    Python类型转换和使用帮助信息
    Feedback Control
    【July】【Machine Leraning】1.微积分和概率论
    Homework
    美海军研究生院(NPS' Advanced Robotic Systems Engineering Laboratory (ARSENL) ) 50 Autonomous UAVs in Flight
  • 原文地址:https://www.cnblogs.com/AseanA/p/7634919.html
Copyright © 2011-2022 走看看