for2024蓝桥杯 NEFU OJ 1643

Description

在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果。例如,对某观点表示支持的有 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 的值尽可能小。

Input

一行三个整数 A,B,L,每两个整数之间用一个空格隔开,分别表示支持人数、反对人数以及上限。

Output

一行两个整数 A′ 和 B′,中间用一个空格隔开,表示化简后的比例。

Sample Input

1498 902 10

Sample Output

5 3

Hint

单组输入,1<=A,B<=1000000,1<=L<=100,A/B<=L

思路

天哪!!!刚看到这道题时被吓到了呜呜┭┮﹏┭┮,亲爱的朋友们,当你第一眼看到这道题的时候,是否和我有同感,又是分数,又有这个要求,又有那个要求,根本无从下手好嘛。这个时候我们要做的事就是冷静,冷静,再冷静!!!我们要相信寄几的能力,不管怎样先试试再说,总不能直接“参考答案”吧。往往在我实在没有很“通畅”的思路来解决这道题时,我的办法就是不管三七二十一,按部就班地、老老实实地、脚踏实地地、一步步根据它的要求筛选出正确答案。只要我们能一个要求一个要求的满足它的条件,最后准能通过!

通过观察A、B、L的值我们可以了解,L作为A'和B'的上限很大程度缩小了A'和B'的取值范围,这对我们来说是非常有利的,因为1<=L<=100,所以我们只要都从100往下筛值就可以,循环两次,100*100=1e4,循环的时间是够用的。接下来使用if语句来满足其他条件就可以了。互质的条件我是用欧几里得算法(即辗转相除法)来控制的。

还有一点,因为A和B我设置为int类型,所以A/B这个语句在c++中计算出的结果自然也是int类型,会自动向下取整,例如5/3=1。为了更准确的比较A’/B'和A/B的大小,需要先乘1.0来把结果变成double类型的,这样计算出来的值就是更为准确的小数。

代码

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int gcd(int a,int b)
{
    if(b==0) return a;
    else
    return gcd(b,a%b);
}
int main()
{
    int A,B,L;
    cin>>A>>B>>L;
    int a,b;
    double min=100;
    double p,q;
    for(int i=L;i>=1;i--)
    {
        for(int j=L;j>=1;j--)
        {
            //cout<<i<<" "<<j<<"次数"<<endl;
            if(gcd(i,j)==1)
            {
                //cout<<i<<" "<<j<<"次"<<endl;
                p=(A*1.0)/B;
                q=(i*1.0)/j;
                if(q>p||q==p)
                {
                    double ans=q-p;
                    if(ans<min)
                    {
                        //cout<<ans<<" "<<min<<"he"<<endl;
                    a=i;
                    b=j;
                    min=ans;
                    //cout<<a<<" "<<b<<" "<<p<<" "<<q<<endl;
                    }
                }
            }
        }
    }
    cout<<a<<" "<<b<<endl;
    //cout<<gcd(A,B)<<endl;
    //cout << "Hello world!" << endl;
    return 0;
}

错误

对了,给大家提个醒,我在做这道题时还犯了一个错误,自以为这道题是分数,就自以为B'的值比A'的值小,所以想把j的循环从i值开始,结果后来再看一边题目时,发现,这道题是求比例,所以根本不存在什么谁一定比谁大,这简直就是画蛇添足!!!自以为是!!!请大家引以为戒,相信你们肯定不会犯这种错误哈哈。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值