蓝桥杯练习-简单1

小蓝有一个神奇的炉子用于将普通金属0 冶炼成为一种特殊金属X。这个炉子有一个称作转换率的属性V,V是个正整数,这意味着消耗V 个普通金属 O恰好可以治炼出一个特殊金属 X
当普通金属O 的数目不足V 时,无法继续治炼属,现在给出了 N 条治炼记录,每条记录中包含两个整数 A和B,这表示本次投入了A个首通金属O,最终治炼出了B 个特殊金属 X。每条记录都是独立的,这意味着上一次没消耗完的普通金属 o 不会累加到下一次的治炼当中根据这 N条治炼记录,请你推测出转换率 V 的最小值和最大值分别可能是多少,题目保证评测数据不存在无解的情况

对于30%评测用列 1<=N<=1e2

对于60%评测用列 1<=N<=1e3

对于100%评测用列 1<=N<=1e4,1<=B<=A<=1e9

     暴力破解法

#include 
#include 
using namespace std;
#define INF 0x3f3f3f3f
const int N = 1e4 + 10;
void solve()
{
    int n;
    cin >> n;
    vector a(n), b(n);  //创建数组
    for (int i = 0; i < n; i++)
        cin >> a[i] >>b[i];
    for (int i = 1; i <=1e6; i++)  //列举速度v
    {
        bool flag = true;
        for (int j = 0; j < n; j++) 
        {
            if (b[j] != a[j] / i)
            {
                flag = false;
                break;
            }
        }
        if (flag)
        {
            cout << i << '/n';                //第一个就是最小值
        }
        
    }
    for (int i = 1e6; i >=1; i--)  //列举速度v
    {
        bool flag = true;
        for (int j = 0; j < n; j++)
        {
            if (b[j] != a[j] / i)
            {
                flag = false;
                break;
            }
        }
        if (flag)
        {
            cout << i << '/n';                       //第一个就是最大值
            break;
        }
        }
       

}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    while (t--)
        solve();

}

二分法

#include 
#include 
using namespace std;
#define INF 0x3f3f3f3f
const int N = 1e4 + 10;
int a[N], b[N];               //b为稀有金属,a为普通金属
int n;                         //n为实验次数
bool check_min(int mid) 
{
    for (int i = 0; i < n; i++)         //n次实验若有一次推测冶炼的结果大于实际冶炼mid值取小了
    {
        if (b[i] < a[i] / mid)  
            return false;

    }
    return true;
}
bool check_max(int mid)
{
    for (int i = 0; i < n; i++)
    {
        if (b[i] > a[i] / mid)
            return false;
    }
    return true;
}
void solve()
{
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> a[i] >> b[i];                
    int left = 1, right = 1e9,mid;
    while (left < right)
    {
        mid = (left + right) >> 1;
        if (check_min(mid))
            right = mid;
        else
            left = mid + 1;

     }
    int left1 = 1, right1 = 1e9;
    while (left1 < right1)
    {
        mid = (left1 + right1+1) >> 1;
        if (check_max(mid))
            left1 = mid;
        else
            right1 = mid - 1;

    }
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    while (t--)
        solve();

}

你可能感兴趣的:(蓝桥杯,职场和发展)