题目

image.png

思路

  • 贪心算法,利用推公式的办法进行形式化证明。
  • 思考一种局部的情况,设第ACW125.耍杂技的牛 - 图2头牛的风险为ACW125.耍杂技的牛 - 图3,第ACW125.耍杂技的牛 - 图4头牛的风险为ACW125.耍杂技的牛 - 图5,如果这两头牛的位置进行交换,可以发现,原先第ACW125.耍杂技的牛 - 图6头牛现在的风险为ACW125.耍杂技的牛 - 图7,原先第ACW125.耍杂技的牛 - 图8头牛现在的风险为ACW125.耍杂技的牛 - 图9。换言之,原先第ACW125.耍杂技的牛 - 图10头牛的增量为:ACW125.耍杂技的牛 - 图11,原先第ACW125.耍杂技的牛 - 图12头牛的增量为ACW125.耍杂技的牛 - 图13
  • 4个数据当中,希望最大值最小,也就是希望ACW125.耍杂技的牛 - 图14ACW125.耍杂技的牛 - 图15当中的最大值最小,如果交换之前的风险是小的,也就是ACW125.耍杂技的牛 - 图16这个关系必须成立。
  • 所以可以依据ACW125.耍杂技的牛 - 图17的值从小到大进行排序,越小的越应该放在下面。

    代码

    ```cpp

    include

    include

    include

    include

using namespace std;

const int N = 5 * 1e5 + 5;

bool cmp (pair a, pair b) { return a.first + a.second < b.first + b.second; } int main() { pair nums[N]; int n = 0; cin >> n; for (int i = 0; i < n; ++i) { cin >> nums[i].first; cin >> nums[i].second; }

  1. sort(nums, nums + n, cmp);
  2. int sum[N];
  3. memset(sum, 0, sizeof(sum));
  4. for (int i = 1; i < n; i++) {
  5. sum[i] = sum[i - 1] + nums[i - 1].first;
  6. }
  7. int max_num = INT_MIN;
  8. for (int i = 0; i < n; ++i) {
  9. max_num = max(max_num, sum[i] - nums[i].second);
  10. }
  11. cout << max_num << endl;
  12. return 0;

} ```