第14届蓝桥杯 | 冶炼金属

这篇具有很好参考价值的文章主要介绍了第14届蓝桥杯 | 冶炼金属。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者:指针不指南吗
专栏:第14届蓝桥杯真题

🐾慢慢来,慢慢来🐾

题目

链接: 4956. 冶炼金属 - AcWing题库

小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。

这个炉子有一个称作转换率的属性 V,V 是一个正整数,这意味着消耗 V 个普通金属 O 恰好可以冶炼出一个特殊金属 X,当普通金属 O 的数目不足 V 时,无法继续冶炼。

现在给出了 N 条冶炼记录,每条记录中包含两个整数 A 和 B,这表示本次投入了 A 个普通金属 O,最终冶炼出了 B 个特殊金属 X。

每条记录都是独立的,这意味着上一次没消耗完的普通金属 O 不会累加到下一次的冶炼当中。

根据这 N 条冶炼记录,请你推测出转换率 V 的最小值和最大值分别可能是多少,题目保证评测数据不存在无解的情况

输入格式

第一行一个整数 N,表示冶炼记录的数目。

接下来输入 N 行,每行两个整数 A、B,含义如题目所述。

输出格式

输出两个整数,分别表示 V 可能的最小值和最大值,中间用空格分开。

数据范围

对于 30% 的评测用例,1≤N≤ 1 0 2 10^2 102
对于 60% 的评测用例,1≤N≤ 1 0 3 10^3 103
对于 100% 的评测用例,1≤N≤ 1 0 4 10^4 104 ,1≤B≤A≤ 1 0 9 10^9 109

输入样例:

3
75 3
53 2
59 2

输出样例:

20 25

样例解释

当 V=20 时,有:[ 75 20 \frac{75}{20} 2075] =3,⌊ 53 20 \frac{53}{20} 2053⌋ =2,⌊ 59 20 \frac{59}{20} 2059⌋ =2,可以看到符合所有冶炼记录。

当 V=25 时,有:[ 75 25 \frac{75}{25} 2575] =3,⌊ 53 25 \frac{53}{25} 2553⌋ =2,⌊ 59 25 \frac{59}{25} 2559⌋ =2,可以看到符合所有冶炼记录。

且再也找不到比 20 更小或者比 25 更大的符合条件的 V 值了。

代码摸索

第一次 AC 5/10

  1. 用两个数组把 n 组 A、B存起来;

  2. 在1~ 1 0 5 10^5 105 找到第一个满足条件的 V,即minV;

    1 0 5 10^5 105 ~1找到第一个满足条件的 V,即maxV;

把数据范围 N 卡在 $10^5,是因为在 1~ N之间遍历判断的,如果 1 0 9 10^9 109 样例调用famx地时候就会TLE ,更不行

每次遍历整个数据范围,O 很大,由这两点判断必须使用二分优化

#include<bits/stdc++.h>
using namespace std;

const int N=1e5,M=1e4+10;

int a[M]; //a存的是A
int b[M]; //b存的是B

int n; //q表示有几组数据

//从小数到大数来寻找
int fmin(int a[],int b[])
{
    for(int i=1;i<N;i++)  //i表示转换率V
    {
        int flag=0;  //使用flag标志

        for(int j=0;j<n;j++)  //通过 j 来遍历数组中的元素
        {
            if(a[j]/i!=b[j])  
                flag=1; //只要有一个不满足就改变 flag 为1
        }
        if(flag==0) //全部满足,即找到所需要的,直接返回i
            return i;
    }
}

//从大数往小数来寻找
int fmax(int a[],int b[])
{
   
    for(int i=N;i>=1;i--)  
    {
        int flag=0;
        for(int j=0;j<n;j++)  //数组
        {
            if(a[j]/i!=b[j])
                flag=1;
        }
        if(flag==0)
            return i;
    }
}

int main()
{
    scanf("%d",&n);
    
    for(int i=0;i<n;i++)
    {
        scanf("%d%d",&a[i],&b[i]); //读入 n 组A,B
    }
    
    printf("%d %d",fmin(a,b),fmax(a,b)); //输出
    
    return 0;
}

第二次 AC 100%

二分优化

#include<bits/stdc++.h>
using namespace std;

const int N=1e9,M=1e5+10;

int a[M]; //a存的是A
int b[M]; //b存的是B

int n; //q表示有几组数据

bool check1(int k)
{
     for(int j=0;j<n;j++)  //通过 j 来遍历数组中的元素
    {
        if(a[j]/k>b[j])
            return false;
    }
    return true;
}

bool check2(int k)
{
     for(int j=0;j<n;j++)  //通过 j 来遍历数组中的元素
    {
        if(a[j]/k<b[j])
            return false;
    }
    return true;
}

int main()
{
    scanf("%d",&n);
    
    for(int i=0;i<n;i++)
    {
        scanf("%d%d",&a[i],&b[i]);
    }
    
    int l=1,r=N;
    while(l<r)
    {
        int mid=l+r>>1;
        if(check1(mid)) r=mid;
        else l=mid+1;
    }
    
    printf("%d ",l);
    
    l=1,r=N;
    while(l<r)
    {
        int mid=l+r+1>>1;
        if(check2(mid)) l=mid;
        else r=mid-1;
    }
    
    printf("%d ",l);
    
    return 0;
}

反思

  1. 取下限,直接可以使用/做到
  2. 数组最大能开多大
#include<bits/stdc++.h>
using namespace std;
//在本人环境中
int c[20000][20000];
//全局数组能开到20000*20000

int main()
{
	int b[100][100];	        
	// 函数中二维数组最大能开100*100
	char a[4* 518028];
	// 函数中的char数组最大能开4*518028
	int b1[500000];  
	// int最大能开到518028 
	return  0;
}

那么大的数据范围,就不应该去遍历,去尝试,应该直接二分

这个题是我后来自己做出来的,我哭死TvT

当时考的时候,还是太紧张了,有点手忙脚乱的感觉,没有写出来,确实没有很难

第14届蓝桥杯 | 冶炼金属文章来源地址https://www.toymoban.com/news/detail-424724.html

到了这里,关于第14届蓝桥杯 | 冶炼金属的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 蓝桥杯【第14届省赛】Python B组

    居然是全省第二 (广东 B 组省一共 91 人,前 2.1%),差点没把我笑死 运气成分比较多,当时比赛的时候只做对了 A、C、I,然后在 D、F、J 混了点分 (本题解是赛后思考修正的),归功于 I 的分值比较高又刚好会做哈哈 测试链接:https://www.dotcpp.com/oj/train/1093/ 【问题描述】     

    2023年04月19日
    浏览(46)
  • 蓝桥杯【第14届国赛】Python B组

    倒数第二题交的时候多了一个print,只拿了国二,吐血 本题解仅代表个人观点,仅供参考,欢迎各位指正 【问题描述】         小蓝有 20230610 颗磁力弹珠,他对金字塔形状尤其感兴趣,如下图所示:         高度为 1 的金字塔需要 1 颗弹珠;         高度为 2 的

    2024年02月08日
    浏览(102)
  • 第14届蓝桥杯C++B组省赛

    今年比去年 难好多 = = Update 2023.4.10 反转了,炼金二分没写错,可以AC了 Update 2023.4.9 rnm退钱,把简单的都放后面是吧。在C语言网测了一下民间数据,地址在这里。果然,二分写错了0分qwq,更新一个正确做法。飞机场不知道为什么也T了(很对的时间复杂度啊)。最后再更新一

    2023年04月17日
    浏览(33)
  • 第14届蓝桥杯C++A组题解

    不会写 枚举第i行 二进制枚举状态 然后check(i)是否合法,如果合法就dfs(i+1) check是核心 判断第上一行是否==A[i][j] 判断第i行是否小于等于A且,c+3=A 判断下一行是否小于等于A且,c+6=A 按位做就好了 比如 5 1 2 3 4 5 bit=0 数组变成 10101 bit=1 数组变成 01100 单独考虑bit=0,模2意义

    2023年04月09日
    浏览(31)
  • web蓝桥杯真题--14、关于你的欢迎语

    营销号,有时候需要一些特定的欢迎语,但针对特定的用户,我们希望可以个性化一点。本题需要在项目文件中修改代码存在的问题,实现根据模版生成特定用户的欢迎语。 本题已经内置了初始代码,打开实验环境,目录结构如下: 其中: css/style.css  是页面样式文件。 c

    2024年01月25日
    浏览(31)
  • 蓝桥杯单片机学习14——第十三届省赛题

    上期我们学习了NE555方波发生器频率测量,讲到我会更新之后省赛的题目,那么,他来了。 首先声明:我还没有参加蓝桥杯单片机比赛,也没有拿过奖,所以我写的代码注定不会那么完美,存在BUG是必然的,我写这个系列的目的纯粹是为了记录我的学习………… 关于功能描述

    2024年02月06日
    浏览(57)
  • 蓝桥杯【第14届省赛】Python B组 76.10分

    居然是全省第二 (广东 B 组省一共 91 人,前 2.1%),差点没把我笑死 运气成分比较多,当时比赛的时候只做对了 A、C、I,然后在 D、F、J 混了点分 (本题解是赛后思考修正的),归功于 I 的分值比较高又刚好会做哈哈 测试链接:https://www.dotcpp.com/oj/train/1093/ 【问题描述】     

    2024年02月05日
    浏览(40)
  • 蓝桥杯单片机14届记录 + 6-13届省赛代码+试题

    客观题 01. 一个 8 位的 DAC 转换器,供电电压为 3.3V,参考电压 2.4V,其 1LSB 产生的输出电 压增量是( )V。 A. 0.0129 B. 0.0047 C. 0.0064 D. 0.0094  02. IAP15F2K61S2 单片机支持通过哪些接口进行在线调试( )。 A. SPI B. UART C. I2C D. JTAG  03. 下列电路中属于时序逻辑电路的是( )。 A. 计数

    2024年02月06日
    浏览(53)
  • <蓝桥杯软件赛>零基础备赛20周--第14周--BFS

    报名明年4月蓝桥杯软件赛的同学们,如果你是大一零基础,目前懵懂中,不知该怎么办,可以看看本博客系列:备赛20周合集 20周的完整安排请点击:20周计划 每周发1个博客 ,共20周。 在QQ群上交流答疑: 第14周:   BFS   第12周博客用“一群老鼠走迷宫”做比喻介绍了BF

    2024年01月18日
    浏览(69)
  • 14届蓝桥杯青少组选拔赛C++_2022.11.27

    14届蓝桥杯青少组选拔赛C++_2022.11.27 一、选择题 T1. 执行 cout 5 / 3; 语句后,输出的结果是(   B  )。 A、0 B、1 C、2 D、3 T2. 执行以下代码,输出的结果是( B )。 char a[6] = {\\\'a\\\', \\\'b\\\', \\\'c\\\', \\\'d\\\'}; cout sizeof(a); A、4 B、6 C、8 D、12 T3. 关于C++中的一维数组,以下描述正确的是( B  )。 A、数组中

    2024年02月06日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包