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
  • 相关阅读:
    学习动态性能表 第五篇V$SESSION
    学习动态性能表 第八篇V$LOCK
    学习动态性能表 第十九篇V$UNDOSTAT
    学习动态性能表 第四篇(1)V$SQLTEXT
    学习动态性能表 第十六篇V$ROWCACHE
    学习动态性能表 第十八篇V$SYSTEM_EVENT
    备份打开的数据库脚本
    学习动态性能表 第九篇V$FILESTAT
    学习动态性能表 第六篇(1)V$SESSION_WAIT
    学习动态性能表 第二十篇V$WAITSTAT
  • 原文地址:https://www.cnblogs.com/ckxkexing/p/9107740.html
Copyright © 2011-2022 走看看