题目
小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V,V 是一个正整数,这意味着消耗 V 个普通金属 O 恰好可以冶炼出一个特殊金属 X,当普通金属 O 的数目不足 V 时,无法继续冶炼。现在给出了 N 条冶炼记录,每条记录中包含两个整数 A 和 B,这表示本次投入了 A 个普通金属 O,最终冶炼出了 B 个特殊金属 X。每条记录都是独立的,这意味着上一次没消耗完的普通金属 O 不会累加到下一次的冶炼当中根据这 N 条冶炼记录,请你推测出转换率 V 的最小值和最大值分别可能是多少,题目保证评测数据不存在无解的情况。
样例输入
3 75 3 53 2 59 2
样例输出
20 25
对于 30% 的评测用例,1 ≤ N ≤ 1e2
对于 60% 的评测用例,1 ≤ N ≤ 1e3
对于 100% 的评测用例,1 ≤ N ≤ 104,1 ≤ B ≤ A ≤ 1e9
题解:
由题目要求我们得到N条记录的最大与最小的转化率,我们可以先找出每一条记录中转化率的最大值与最小值由临时变量temp1与temp2表示(temp1表示最大,temp2表示最小)
显而易见,最大值为a/b的商,而最小值则是金属a转化成比所给的金属b多一个再加一,使之刚好不能再转化代码表示如下:
/*每条记录中的最大与最小值*/
temp1=a/b;
temp2=a/(b+1)+1;
要求出所有记录中转化率的最大值与最小值,我们不妨先列一个表格:
a | b | 转化率V | |||||||||||
75 | 3 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | |||||
53 | 2 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | |||
59 | 2 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
表格中的黄色为三组数据共有的部分,就是求出N组数据中转化率V的交集,交集中的最大值和最小值就是我们要求的答案。
我们通过规律进一步可知所有记录中转化率的最大值是每条记录最大值中的最小值;最小值是每条记录中最小值的最大值
所以只需要比较每条记录中的最值即可,
我们先定义两个最值变量:, 再在N条记录中比较最值,最后打印Max_V和Min_V即可
#include<stdio.h>
int main(){
int n;
int Max_v=1000000000;
int Min_v=0;
int temp1; /*每一组数据中存储最大值的临时变量*/
int temp2; /*每一组数据中存储最小值的临时变量*/
scanf("%d",&n);
for(int i =1;i<=n;i++){
int a,b;
scanf("%d %d",&a, &b);
temp1 = a/b;
temp2 = a/(b+1)+1;
if(temp1<Max_v){
Max_v=temp1;
}
if(temp2>Min_v){
Min_v=temp2;
}
}
printf("%d %d",Min_v,Max_v);
return 0;
}
运行结果如下: