未命名02

文章展示了在C++中解决关于金属冶炼转换率问题的编程实例,通过分析冶炼记录确定最小和最大转换次数
摘要由CSDN通过智能技术生成

2023年第十四届蓝桥杯大赛软件类省赛C/C++大学B组真题

蓝桥杯2023年第十四届省赛真题-冶炼金属

题目描述
小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V,V 是一个正整数,这意味着消耗 V 个普通金

属 O 恰好可以冶炼出一个特殊金属 X,当普通金属 O 的数目不足 V 时,无法继续冶炼。
现在给出了 N 条冶炼记录,每条记录中包含两个整数 A 和 B,这表示本次投入了 A 个普通金属 O,最终冶炼出了 B 个特殊金属 X。每条记录都是独立
的,这意味着上一次没消耗完的普通金属 O 不会累加到下一次的冶炼当中。

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

输入格式
第一行一个整数 N,表示冶炼记录的数目。
接下来输入 N 行,每行两个整数 A、B,含义如题目所述。

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

第一次尝试

#include <stdio.h>
int main(){
	int N;
	scanf ("%d",&N);
	int A;
	int B;
	int max[N];
	int min[N];
	int i;
	int m;
	for (m=0;m<N;m++){
		scanf ("%d",&A);
	    scanf ("%d",&B);
    	for (i=0;i<=A;i++){
	    	if (A/i==B){
		    	min[m]=i;
			    break;
    		}
    	}
	    for (;i<=A;i++){
		    if (A/i==B){
			    max[m]=i;
	    	}
	    }
	}
	for (m=1;m<N;m++){
		if (min[m]<min[0]){
			min[0]=min[m];
		}
		if (max[m]>max[0]){
			max[0]=max[m];
		}
	}
	printf ("%d %d",min[0],max[0]);
	return 0;
}
编译失败

第二次尝试

#include <stdio.h>
int main(){
	int N;
	scanf ("%d",&N);
	int A[N];
	int B[N];
	int max[N];
	int min[N];
	int i;
	int m;
	for (m=0;m<N;m++){
		scanf ("%d",&A[m]);
	    scanf ("%d",&B[m]);
	}
	for (m=0;m<N;m++){
		int n=A[m]/B[m];
    	for (i=n;i>0;i--){
		    if (A[m]/i==B[m]){
			    max[m]=i;
			    break;
	    	}
    	}
	    for (;i>0;i--){
	    	if (A[m]/i==B[m]){
		    	min[m]=i;
    		}
	    }
	}
	for (m=1;m<N;m++){
		if (min[m]>min[0]){
			min[0]=min[m];
		}
		if (max[m]<max[0]){
			max[0]=max[m];
		}
	}
	printf ("%d %d",min[0],max[0]);
	return 0;
}
64%

正解

#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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值