zoukankan      html  css  js  c++  java
  • Educational Codeforces Round 43 E&976E. Well played! 贪心

    传送门:http://codeforces.com/contest/976/problem/E

    参考:https://www.cnblogs.com/void-f/p/8978658.html

    题意:

    对于每一个生物,有一个ph值和伤害值。现在有a次使ph值乘2的机会,有b次是伤害值等于ph值得机会。

    问最后能得到最大的伤害总和是多少。

    思路:自己一开始也想的是贪心,但是贪的姿势不正确。明确,a次一定是给同一个生物放大的。但是至于是对哪一个生物放大,还是要用暴力一个一个去找,而不要对排序后第一个值操作;

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <string>
    #include <vector>
    #include <map>
    #include <set>
    #include <queue>
    #include <list>
    #include <iterator>
    #include <cmath>
    using namespace std;
    
    #define lson (l , mid , rt << 1)
    #define rson (mid + 1 , r , rt << 1 | 1)
    #define debug(x) cerr << #x << " = " << x << "
    ";
    #define pb push_back
    
    #define Pll pair<ll,ll>
    #define Pii pair<int,int>
    
    #define fi first
    #define se second
    
    #define OKC ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
    typedef long long ll;
    typedef unsigned long long ull;
    
    /*-----------------show time----------------*/
    const int maxn = 2e5+9;
    int a,b,n;
    struct node {
        ll h,d;
        ll w;
    }t[maxn];
    const ll inf = 0x3f3f3f3f3f3f3f3f;
    int main(){
        OKC;
        cin>>n>>a>>b;
        for(int i=1; i<=n; i++)
        {
            cin>>t[i].h>>t[i].d;
            t[i].w = t[i].h - t[i].d;
            if(t[i].w<0)t[i].w = 0;
        }
        ll sum = 0;
        sort(t+1,t+1+n,[](node a,node b){return a.w>b.w;});
        for(int i=1; i<=n; i++)
        {
            if(i<=b)sum += max (t[i].h,t[i].d);
            else sum += t[i].d;
        }
        ll ans = sum;
        if(b==0)cout<<ans<<endl;
        else 
        {
            for(int i=1; i<=n; i++)
            {
                ll tmp = sum;
                if(i<=b)
                {
                    tmp -= max(t[i].h,t[i].d);
                    tmp += 1ll*(t[i].h<<a);
                }
                else 
                {
                    tmp -= t[i].d;
                    tmp += 1ll*(t[i].h<<a);
                    tmp += t[b].d;
                    tmp -= max(t[b].d,t[b].h);
                }
                if(ans<tmp)ans = tmp;
            }
            cout<<ans<<endl;
        }
    
        return 0;
    }
    CF976E
  • 相关阅读:
    EEPlat 的 后台业务处理模型
    poj 1012 Joseph (约瑟夫问题)
    python使用正則表達式
    二维码_encode与decode
    UITableView显示不全
    Bottle 中文文档
    不相交集python实现
    面试题1:落单的数
    Android开发/源代码资源汇总
    leetCode 26.Remove Duplicates from Sorted Array(删除数组反复点) 解题思路和方法
  • 原文地址:https://www.cnblogs.com/ckxkexing/p/9107740.html
Copyright © 2011-2022 走看看