day34-蓝桥杯2023年第十四届省赛真题-冶炼金属
题目描述
小蓝有一个神奇的炉子用于将普通金属 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; }
更多推荐
所有评论(0)