题目
思路
这题不是很难哈,用暴力也可以直接写出来,但是这题不是填空题哈,而且题目规定的测评用例数据还是蛮大的,为避免超时,我们还是思考一下比较好的算法来解决。
不知道大家初中数学有没有做到那种求数据集的最大下界和最小上界的问题哈,就拿题目给的用例来说吧。
A | B | 上界(A/B) | 说明 | 下界 (A/(B+1)) | 说明 |
75 | 3 | 25 | 要满足要求,V最多设置为25,再多就不能生产3个X了 | 18 | 要生产出4个X,V最多设置为18,再多就只能生产3个了 |
53 | 2 | 26 | 要满足要求V最多设置为26,再多就不能生产2个X了 | 17 | 要生产出3个X,V最多设置为17,再多就只能生产2个了 |
59 | 2 | 29 | 要满足要求,V最多设置为29,再多就不能生产2个X了 | 19 | 要生产出3个X,V最多设置为19,再多就只能生产2个了 |
终上分析,为了符合三组数据的需求,V的最大值就是最小上界25,V的最小值就是最大下界+1,也就是20。这就是这个解决这个问题的思路,接下来就是按照这个思路遍历数据找到最小上界V_max和最大下界V_min。当然,大家也能通过二分排序的思想设计算法,但我这人比较懒,能直接解决的我绝不会再画功夫去想更好的算法,哈哈哈^-^。
代码
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int N = 0;
scanf("%d",&N);
int data[N][2];
for(int i =0;i<N;i++){
for(int j=0;j<2;j++){
scanf("%d",&data[i][j]);
}
}
//思路:最小值:最大下界+1;最大值:最小上界
int minV = data[0][0]/(data[0][1]+1);
int maxV = data[0][0]/data[0][1];
for(int i=1;i<N;i++){
if(minV<data[i][0]/(data[i][1]+1)){
minV = data[i][0]/(data[i][1]+1);
}
if(maxV>data[i][0]/data[i][1]){
maxV = data[i][0]/data[i][1];
}
}
printf("%d %d",minV+1,maxV);
return 0;
}