• CF976E Well played!


    思路:

    参考了http://codeforces.com/blog/entry/59195

    可以证明在最优解中所有的第一种操作都是施加同一个物种上的。那么首先按照hp - dmg对所有物种降序排序,贪心选择前b个进行第二种(赋值)操作。然后枚举所有物种,选择一个进行第一种操作,在所有情况中取最大值。

    在选择一个物种进行第一种操作的时候,不要按照(hp << a) - dmg贪心,反例:

    3 1 2

    20 10

    5 1

    25 25

    实现:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 typedef pair<ll, ll> pll;
     5 
     6 const int MAXN = 200005;
     7 const ll INF = 0x3f3f3f3f3f3f3f3f;
     8 
     9 vector<pll> v;
    10 
    11 bool cmp(pll & x, pll & y)
    12 {
    13     return x.first - x.second > y.first - y.second;
    14 }
    15 
    16 int main()
    17 {
    18     int n, a, b;
    19     while (cin >> n >> a >> b)
    20     {    
    21         v.resize(n);
    22         ll ans = 0;
    23         for (int i = 0; i < n; i++) 
    24         {
    25             cin >> v[i].first >> v[i].second;
    26             ans += v[i].second;
    27         }
    28         if (!b) { cout << ans << endl; continue; }
    29         sort(v.begin(), v.end(), cmp);
    30         int i = 0;
    31         for ( ; i < v.size(); i++)
    32         {
    33             if (v[i].first <= v[i].second) break;
    34         }
    35         int pos = min(n, min(i, b));
    36         ans = 0;
    37         for (int i = 0; i < pos; i++) ans += v[i].first;
    38         for (int i = pos; i < n; i++) ans += v[i].second;
    39         ll maxn = ans;
    40         for (int i = 0; i < n; i++)
    41         {
    42             if (i < pos)
    43             {
    44                 ll tmp = ans - v[i].first + (v[i].first << a);
    45                 if (tmp > maxn) maxn = tmp;
    46             }
    47             else
    48             {
    49                 ll tmp = ans - v[i].second + (v[i].first << a);
    50                 if (pos && pos == b) tmp += - v[pos - 1].first + v[pos - 1].second;
    51                 if (tmp > maxn) maxn = tmp;
    52             }
    53         }
    54         cout << maxn << endl;
    55     }
    56     return 0;
    57 }
  • 相关阅读:
    JavaScript核心参考
    面向对象的程序设计之工厂模式
    ES6中promise的使用方法
    详解 Vue 2.4.0 带来的 4 个重大变化
    Vue.js 1.x 和 2.x 实例的生命周期
    表单控件的全面分析
    元素的一些常用属性
    为表格增加的方法
    Element类型知识大全
    6-3.斜体标签
  • 原文地址:https://www.cnblogs.com/wangyiming/p/9060966.html
Copyright © 2020-2023  润新知