【每日例题】 蓝桥杯 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;
}

  

 

posted @   山远尽成云  阅读(392)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示