[蓝桥杯]真题解说:冶炼金属(暴力+二分)

打印 上一主题 下一主题

主题 1001|帖子 1001|积分 3003

一、视频解说

视频解说

二、暴力代码

  1. //暴力代码
  2. #include<bits/stdc++.h>
  3. #define endl '\n'
  4. #define deb(x) cout << #x << " = " << x << '\n';
  5. #define INF 0x3f3f3f3f
  6. using namespace std;
  7. const int N = 1e4 + 10;
  8. void solve()
  9. {
  10.         int n; cin >> n;
  11.         vector<int>a(n), b(n);//创建数组
  12.         for(int i = 0; i < n; i ++)
  13.                 cin >> a[i] >> b[i];
  14.         for(int i = 1; i <= 1e6; i ++)//枚举的转化率V
  15.         {
  16.                 bool flag = true;//标记一下当前的V是否合法
  17.                 for(int j = 0; j < n; j ++)
  18.                 {
  19.                         if(b[j] != (a[j] / i))
  20.                         {
  21.                                 flag = false;
  22.                                 break;
  23.                         }
  24.                 }
  25.                 if(flag)
  26.                 {
  27.                         cout << i << " ";
  28.                         break;
  29.                 }
  30.         }
  31.        
  32.         for(int i = 1e6; i >= 1; i --)
  33.         {
  34.                 bool flag = true;
  35.                 for(int j = 0; j < n; j ++)
  36.                 {
  37.                         if(b[j] != (a[j] / i))
  38.                         {
  39.                                 flag = false;
  40.                                 break;
  41.                         }
  42.                 }
  43.                 if(flag)
  44.                 {
  45.                         cout << i << " ";
  46.                         break;
  47.                 }
  48.         }
  49.        
  50. }
  51. signed main()
  52. {
  53.         ios::sync_with_stdio(0);
  54.         cin.tie(0);
  55.         cout.tie(0);
  56.         int t;
  57.         t = 1;
  58.         //cin >> t;
  59.         while(t--)
  60.         solve();
  61. }
复制代码
三、正解代码

  1. //冶炼金属:二分
  2. #include<bits/stdc++.h>
  3. #define int long long
  4. using namespace std;
  5. const int N = 1e4 + 10;
  6. int a[N], b[N];
  7. int n;
  8. bool check_min(int mid)
  9. {
  10.         for(int i = 0; i < n; i ++)
  11.         {
  12.                 if(b[i] < a[i] / mid)
  13.                         return false;
  14.         }
  15.         return true;
  16. }
  17. bool check_max(int mid)
  18. {
  19.         for(int i = 0; i < n; i ++)
  20.                 if(b[i] > a[i] / mid)
  21.                         return false;
  22.         return true;
  23. }
  24. void solve()
  25. {
  26.         cin >> n;
  27.         for(int i = 0; i < n; i ++)
  28.                 cin >> a[i] >> b[i];
  29.         //求最小值。
  30.         int lmin = 1, rmin = 1e9;
  31.        
  32.         while(lmin < rmin)
  33.         {
  34.                 int mid = lmin + rmin >> 1;
  35.                 if(check_min(mid))
  36.                         rmin = mid;
  37.                 else
  38.                         lmin = mid + 1;
  39.         }
  40.         //求最大值。
  41.         int lmax = 1, rmax = 1e9;
  42.         while(lmax < rmax)
  43.         {
  44.                 int mid = lmax + rmax + 1 >> 1;
  45.                 if(check_max(mid))
  46.                         lmax = mid;
  47.                 else
  48.                         rmax = mid - 1;
  49.         }
  50.         cout << lmin << " " << lmax << endl;
  51. }
  52. signed main()
  53. {
  54.         ios::sync_with_stdio(0);
  55.         int t = 1;
  56.         // cin >> t;
  57.         while(t--)
  58.         solve();
  59. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

去皮卡多

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表