"今天是 L 公司发工资的一天。\n\n 名员工排成一排准备领工资,编号为 1 ∼ n,第 i 名员工有一个期望快乐值 a i \。\n\n老板非常扣,在这 n 名员工中只选择了 m 名员工 1, 2, ⋯, b 1 ,b 2 ,⋯,b m 发 k 元工资。\n\n员工们都非常具有同理心,不仅自己获得工资时会增加快乐值,当周围的员工获得工资时自己也会增加快乐值。\n\n具体地,当与一名员工 A 距离为 d 的员工获得了工资,A 的快乐值会增加 max(0,k−d)。特别地,如果 A 本身就获得了工资,A 的快乐值会增加 k。\n\n老板希望,你能找到最小的整数 k,使得所有员工的快乐值不低于他的期望。\n\n输入格式\n第一行两个整数 n,m。\n\n第二行 n 个整数 a 1 ,a 2 ,⋯,a n 。\n\n第三行 m 个整数 b 1 ,b 2 ,⋯,b m 。\n\n输出格式\n一个整数,表示你求出的最小的 k。c++代码内容:#include \n#include \n#include \n\nusing namespace std;\n\nint main() {\n int n, m;\n cin >> n >> m;\n\n vector a(n);\n for (int i = 0; i < n; i++) {\n cin >> a[i];\n }\n\n vector b(m);\n for (int i = 0; i < m; i++) {\n cin >> b[i];\n }\n\n sort(a.begin(), a.end());\n sort(b.begin(), b.end());\n\n int max_happiness = a[n-1];\n int left = 0, right = m-1;\n while (left <= right) {\n int mid = left + (right - left) / 2;\n int sum = 0;\n for (int i = mid; i >= 0; i--) {\n sum += b[i];\n if (i > 0) {\n sum -= 1;\n }\n }\n\n if (sum >= max_happiness) {\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n\n cout << left << endl;\n\n return 0;\n}

L公司发工资问题:最小工资额计算方法及C++实现

原文地址: https://www.cveoy.top/t/topic/qip0 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录