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的最小整数。

posted @ 2016-07-08 15:23  姚呵呵  阅读(672)  评论(0编辑  收藏  举报