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
  • 相关阅读:
    Struts2+Spring3+Mybatis3开发环境搭建
    spring+struts2+mybatis
    【LeetCode】Populating Next Right Pointers in Each Node
    【LeetCode】Remove Duplicates from Sorted Array
    【LeetCode】Remove Duplicates from Sorted Array II
    【LeetCode】Binary Tree Inorder Traversal
    【LeetCode】Merge Two Sorted Lists
    【LeetCode】Reverse Integer
    【LeetCode】Same Tree
    【LeetCode】Maximum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/ckxkexing/p/9107740.html
Copyright © 2011-2022 走看看