码迷,mamicode.com
首页 > 其他好文 > 详细

[NOIP2014普及组]比例简化

时间:2014-12-02 22:21:15      阅读:1107      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   sp   for   

题目地址:

ayyzvijos:http://pingce.ayyz.cn/vijos/Problem_Show.asp?id=2016

vijos:https://vijos.org/p/1912

COGS:http://218.28.19.228/cogs/problem/problem.php?pid=1810

题目来源:NOIP2014普及组第二题

bubuko.com,布布扣bubuko.com,布布扣

问题分析:题目描述很长,归纳起来,大意就是:

在区间[1,L]内求出2个数A’、B’,这两个数满足:

一、gcd(A’,B’)=1,即A’和B’互素;

二、A/B≤A’/B’;

三、|A’/B’-A/B|的值最小。

考虑到L很小,因此求这两个数时直接穷举即可,不会超时。为了方便实现,我们采用下面的算法:

设置一个存储最小值的变量ans(初值为maxlongint),以及两个临时变量k、l。每次枚举,先判断前两个条件,如果都满足,那么判断|A’/B’-A/B|的值是否小于ans。如果小于,那么ans=|A’/B’-A/B|,k=A’,l=B’。最后输出k和l即可。

这个算法用到了一个性质,即

 任何一对互素的整数的比值都不与其它互素整数的比值相等。 

这样,只要精度足够,每个比值都对应唯一的一对k和l,它的逆命题也成立。这样程序就很简单了。

参考代码:

bubuko.com,布布扣
program radio;
var
a,b,l,i,j,k,m:longint;
p,q,ans:double;
function gcd(x,y:longint):longint;
begin
if y=0 then exit(x) else exit(gcd(y,x mod y));
end;
begin
assign(input,ratio.in);
reset(input);
assign(output,ratio.out);
rewrite(output);
readln(a,b,l);
p:=a/b;
ans:=1010101010;
for i:=1 to l do
  for j:=1 to l do
  if (gcd(i,j)=1)and(i/j>=p)and(i/j-p<ans) then begin
  ans:=i/j-p;
  k:=i;
  m:=j;
  end;
writeln(k, ,m);
close(input);
close(output);
end.
ratio.pas

 

[NOIP2014普及组]比例简化

标签:style   blog   http   io   ar   color   os   sp   for   

原文地址:http://www.cnblogs.com/changke/p/4138561.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!