题目描述
小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V,V 是一个正整数,这意味着消耗 V 个普通金属 O 恰好可以冶炼出一个特殊金属 X,当普通金属 O 的数目不足 V 时,无法继续冶炼。现在给出了 N 条冶炼记录,每条记录中包含两个整数 A 和 B,这表示本次投入了 A 个普通金属 O,最终冶炼出了 B 个特殊金属 X。每条记录都是独立的,这意味着上一次没消耗完的普通金属 O 不会累加到下一次的冶炼当中。根据这 N 条冶炼记录,请你推测出转换率 V 的最小值和最大值分别可能是多少,题目保证评测数据不存在无解的情况。
输入格式
第一行一个整数 N,表示冶炼记录的数目。
接下来输入 N 行,每行两个整数 A、B,含义如题目所述。
输出格式
输出两个整数,分别表示 V 可能的最小值和最大值,中间用空格分开。
样例输入
3 75 3 53 2 59 2
样例输出
20 25
题解
消耗 V 个普通金属 O 恰好可以冶炼出一个特殊金属 X,要求输入 N 条冶炼记录,输出转换率 V 的最小值和最大值。
根据给出样例可得,A / B 即为该条记录 V 的最大值(能到达 ‘<=’),A / (B + 1) 即为该条记录的最小值(不能到达 ‘>’)。求 N 条冶炼记录中转换率 V 的最小值和最大值,即求 N 条冶炼记录中最大的 V_min + 1,最小的 V_max(N 条记录 V 值重叠部分的上下界)。
代码
#include<iostream>
using namespace std;
int main()
{
int N; //冶炼记录的数目
cin>>N;
int A[N],B[N]; //第i条记录普通金属个数和特殊金属个数
for(int i=0;i<N;i++){
cin>>A[i]>>B[i];
}
//for(int i=0;i<N;i++){
// cout<<a[i]<<" "<<b[i]<<endl;
//}
int V_max=A[0]/B[0],V_min=A[0]/(b[0]+1);
for(int i=1;i<N;i++){
if(A[i]/B[i]<V_max) V_max=a[i]/b[i];
if(A[i]/(B[i]+1)>V_min) V_min=a[i]/(b[i]+1);
}
cout<<V_min+1<<" "<<V_max<<endl;
return 0;
}