题目描述

小蓝有一个神奇的炉子用于将普通金属 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 = 20 时,有:⌊75/20⌋ = 3,⌊ 53/20 ⌋ = 2,⌊ 59/20 ⌋ = 2,可以看到符合所有冶炼记录。

当 V = 25 时,有:⌊75/25⌋ = 3,⌊ 53/25 ⌋ = 2,⌊ 59/25 ⌋ = 2,可以看到符合所有冶炼记录。

且再也找不到比 20 更小或者比 25 更大的符合条件的 V 值了。

对于 30% 的评测用例,1 ≤ N ≤ 102。

对于 60% 的评测用例,1 ≤ N ≤ 103。

对于 100% 的评测用例,1 ≤ N ≤ 104,1 ≤ B ≤ A ≤ 109。

解决方案:

1、忽略题目描述,根据提示,直接对示例输入的值处理:

        A/B=V的范围:75/3=25,53/2=26,59/2=29

2、处理后的值是符合条件的范围,对商值进行除法运算,找出 V(商值) 的范围:

        75/26=2<3,即25为最大值,75/24=75/23=...=75/19=3,75/18=4>3

        故 V 的第一个范围:【19,25】

        其余两个以此类推:【17,26】,【20,29】

3、三个范围取交集即为本题所求-->[20,25]

函数源码:

#include<iostream>
#include<vector>
#include <algorithm>

using namespace std;
int main()
{
    int N;
    cin >> N;

    long A[N][2];

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < 2; j++)
            cin >> A[i][j];
    }
    //int min[N]={0};
    //int max[N]={0};
    vector<int>n_min ;
    vector<int>n_max ;
    int ret = 0;
    for (int i = 0; i < N; i++) {
        ret = A[i][0] / A[i][1]; //25=75/3
        for (int n = 1;; n++) {
            if (A[i][0] / (ret + n) < A[i][1]) {//75/26=2
                //max[i]=ret-1;
                n_max.push_back(ret);
                break;
            }
        }
        for (int n = 1;; n++) {
            if (A[i][0] / (ret - n) > A[i][1]) {//75/18=4
                //min[i]=ret-n+1;
                n_min.push_back(ret - n + 1);
                break;
            }

        }
    }
    sort(n_min.begin(),n_min.end());
    sort(n_max.begin(), n_max.end());

    cout << n_min[n_min.size()-1] << " " << n_max[0] << endl;


    return 0;
}
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐