【每日例题】 蓝桥杯 c++ 冶炼金属

发布时间 2023-11-16 13:41:14作者: 山远尽成云

冶炼金属

题目

小蓝有一个神奇的炉子用于将普通金属О冶炼成为一种特殊金属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

如果还是不能理解思路分析,可跟着代码的解析去理解

代码

#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;
}