• NOIP201402比例化简


    试题描述
       在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果。例如,对某一观点表示支持的有 1498 人,反对的有 902 人,那么赞同与反对的比例可以简单的记为1498:902。不过,如果把调查结果就以这种方式呈现出来,大多数人肯定不会满意。因为这个比例的数值太大,难以一眼看出它们的关系。对于上面这个例子,如果把比例记为 5:3,虽然与真实结果有一定的误差,但依然能够较为准确地反映调查结果,同时也显得比较直观。
        现给出支持人数 A,反对人数 B,以及一个上限 L,请你将 A 比 B 化简为 A’比 B’,要求在 A’和 B’均不大于 L 且 A’和 B’互质(两个整数的最大公约数是 1)的前提下,A’/B’ ≥ A/B且 A’/B’ - A/B 的值尽可能小。
    输入
    输入共一行,包含三个整数 A,B,L,每两个整数之间用一个空格隔开,分别表示支持人数、反对人数以及上限。
    输出
    输出共一行,包含两个整数 A’,B’,中间用一个空格隔开,表示化简后的比例。
    输入示例
    1498 902 10
    输出示例
    5 3
    其他说明
    对于 100%的数据,1 ≤ A ≤ 1,000,000,1 ≤ B ≤ 1,000,000,1 ≤ L ≤ 100,A/B ≤ L。

    这道题乍一看没有任何头绪,感觉怎么样都很别扭。但是,仔细看条件就会发现:L是小于100的。这就是说,如果从一开始枚举的话,我们最多只需要枚举100*100=10000次。所以大概的思路就会这样。

    另外还有一点要注意:其实并不用考虑两个是是否互质。原因如下:比如2:4,那么在他之前肯定会算到1:2;所以,在算到2:4的时候,因为与真实结果的差值和1:2是“相等”的。而只有在“小于”的时候,minn的值才会改变。所以根本不用考虑是否互质。

    另外注意,因为需要用到除法,所以全部要定义成double类型。

     1 #include <iostream>
     2 #include <cmath>
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     int a,b,l;
     8     scanf("%d%d%d",&a,&b,&l);
     9     double n=(double)a/(double)b,minn=101,ans1,ans2;
    10     for(int i=1;i<=l;i++)
    11     {
    12         for(int j=1;j<=l;j++)
    13         {
    14             double t=(double)i/(double)j;
    15             if(t>=n && t-n<minn) {minn=t-n;ans1=i;ans2=j;}
    16         }
    17     }
    18     printf("%d %d",(int)ans1,(int)ans2);
    19     //system("pause");
    20     return 0;
    21 }
    NOIP201402比例化简

     P.s:函数cell(x):大于x的最小整数。

  • 相关阅读:
    工作中用到知识点
    工作中遇到问题的解决办法
    透明度兼容性(ie8以上)
    js阻止浏览器默认行为
    js停止冒泡和阻止浏览器默认行为
    js添加事件通用方法
    jquery常用插件
    延迟加载、异步加载js
    JavaScript兼容性问题
    创建对象的一种方式&一种继承机制(代码实例)
  • 原文地址:https://www.cnblogs.com/YXY-1211/p/5653476.html
Copyright © 2020-2023  润新知