【每日例题】 蓝桥杯 c++ 冶炼金属
冶炼金属
题目
小蓝有一个神奇的炉子用于将普通金属О冶炼成为一种特殊金属X。这个炉子有一个称作转换率的属性V,V是一个正整数,这意味着消耗V个普通金属О恰好可以冶炼出一个特殊金属X,当普通金属О的数目不足V时,无法继续冶炼。现在给出了Ⅳ条冶炼记录,每条记录中包含两个整数A和B,这表示本次投入了A个普通金属О,最终冶炼出了B个特殊金属X。每条记录都是独立的,这意味着上一次没消耗完的普通金属О不会累加到下一次的冶炼当中。
根据这N条冶炼记录,请你推测出转换率V的最小值和最大值分别可能是多少,题目保证评测数据不存在无解的情况。
输入格式
第—行一个整数N,表示冶炼记录的数目。
接下来输入N行,每行两个整数A、B,含义如题目所述。
输出格式
输出两个整数,分别表示V可能的最小值和最大值,中间用空格分开。
思路分析
题目简单分析可归纳成一句话:在要求范围内寻找极值,该要求范围为最大最小值都符合【a/最大值or最小值】=b,【】类似于int取整数,只需要整数部分。
所以,我们有了一个思路,求出所有冶炼记录的最大最小值,然后找出所有最小值的最小值,所有最大值的最大值,然后将最大值与最小值往下取,找出最大值与最小值的极值,即出现某条记录中【a/最大值or最小值】不等于b
如果还是不能理解思路分析,可跟着代码的解析去理解
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #include <iostream> using namespace std; int main() { int n,j,t=1; //n为多少条数据,j为记录最大值是否符合数据,t为记录最小值是否复合数据 long int a[10000],b[10000]; //存储每一条数据 long int min=0,max=0; //最小值与最大值 cin>>n; for ( int i=0;i<n;i++) { cin>>a[i]>>b[i]; //输入数据 if (i==0) //为第一条数据时,为最大最小值赋值 { min=a[i]/b[i]; max=a[i]/b[i]; } else //寻找整组数据的最大最小值 { if (a[i]/b[i]<min) min=a[i]/b[i]; else if (a[i]/b[i]>max) max=a[i]/b[i]; } } while (min--) //寻找符合要求的最小值,向下寻找 { for ( int i=0;i<n;i++) { if (a[i]/min>b[i]) //不符合冶炼记录 { t=0; //记录不符合冶炼记录 break ; } } if (t==0) //当前最小值不符合冶炼记录,取前一个最小值 { min++; break ; } } while (max--) //寻找最大值,向下找 { j=0; for ( int i=0;i<n;i++) { if (b[i]*max>a[i]) //不符合要求 break ; else j++; } if (j==n) //符合所有数据,跳出循环 break ; } cout<<min<< " " <<max; return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现