zoukankan      html  css  js  c++  java
  • SPOJ3899——Finding Fractions

    SPOJ上的每个题目都做得我泪牛满面。

    这个题目也是的。题目意思是给你两个分数a/b和c/d,要你求出一个分数p/q,使得a/b<p/q<c/d,且p最小。

    看完题目后半天都没有任何思路哦。于是无奈只好去网上找题解咯。

    终于找到一个神牛的题解,并且自己终于把那个东西给看懂了。

    下面写下我自己的理解吧。

    首先对于我们不要急于求分子,我们只要求出分母q,分子就可以直接用q*a/b+1表示了(想想为什么呢?因为要最小的)。

    那么要求这个分母,首先把第一个分数变成0-1之间,即k=a/b,a-=b*k,同时第二个分数也要做相同的改变,c-=d*k;

    这样不等式的方向都是没有变化的。这时候要是c/d>1,也就是说c>d,那么就说明p/q=1;

    否则我们可以把这个不等式式同时取倒数变为 d/c<q/p<b/a, 这时候我们可以再次递归求解p哦,有了p,q=p*d/c+1;

    恩大概就是这样,具体的证明我也无法给出,好好理解一下吧。

     1 #include <iostream>
     2 using namespace std;
     3 typedef long long ll;
     4 
     5 ll dfs(ll a,ll b,ll c,ll d)
     6 {
     7     ll k=a/b;
     8     a-=b*k,c-=d*k;
     9     if (c>d) return 1;
    10     return dfs( d,c,b,a)*d/c+1;
    11 }
    12 
    13 int main()
    14 {
    15     ll a,b,c,d,p,q;
    16     while (cin>>a>>b>>c>>d)
    17     {
    18         q=dfs(a,b,c,d);
    19         p=q*a/b+1;
    20         cout<<p<<'/'<<q<<endl;
    21     }
    22     return 0;
    23 }
    如有转载,请注明出处(http://www.cnblogs.com/lochan)
  • 相关阅读:
    微信小程序(9)--音频及视频弹幕
    VUE 插槽
    ES6 export
    实现服务端向客户端推消息
    制作镜像语言网站
    xss 防护总结
    一步一步webpack 3
    一步步学习webpack2 配置
    一步步学习webpack 1
    node 插件
  • 原文地址:https://www.cnblogs.com/lochan/p/3350500.html
Copyright © 2011-2022 走看看