• Codeforces976E Well played! 【贪心】


    题目分析:

      由于乘二的收获很大,所以我们可以证明乘的数一定是同一个,接着排序后依次选取,判断一下即可。

    题目代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int maxn = 320000;
     5 
     6 int n,a,b;
     7 
     8 struct node{
     9     int hp,dm;
    10 }d[maxn];
    11 
    12 int cmp(node alpha,node beta){
    13     return alpha.hp-alpha.dm > beta.hp-beta.dm;
    14 }
    15 
    16 void read(){
    17     scanf("%d%d%d",&n,&a,&b);
    18     for(int i=1;i<=n;i++) scanf("%d%d",&d[i].hp,&d[i].dm);
    19     sort(d+1,d+n+1,cmp);
    20 }
    21 
    22 void work(){
    23     int hh = 1;
    24     long long ext = 0,ans = 0;
    25     for(int i=1;i<=a;i++) hh *= 2;
    26     int pt;
    27     for(pt=1;pt<=min(b,n);pt++){
    28     if(d[pt].hp-d[pt].dm <= 0) break;
    29     ans += d[pt].hp;
    30     }
    31     for(int i=pt;i<=n;i++) ans += d[i].dm;
    32     long long em = ans;ext = ans;pt--;
    33     if(b == 0){printf("%lld",ext);return;}
    34     for(int i=1;i<=n;i++){
    35     em = ans;
    36     if(i<=pt){
    37         em = em-d[i].hp+(1ll*d[i].hp*hh);
    38         ext = max(ext,em);
    39     }else{
    40         if(pt < b){
    41         em = em+(1ll*d[i].hp*hh)-d[i].dm;
    42         ext = max(ext,em);
    43         }else{
    44         em = em-d[pt].hp+(1ll*d[i].hp*hh)-d[i].dm+d[pt].dm;
    45         ext = max(ext,em);
    46         }
    47     }
    48     }
    49     printf("%lld",ext);
    50 }
    51 
    52 int main(){
    53     read();
    54     work();
    55     return 0;
    56 }
  • 相关阅读:
    FastCgi与PHPfpm之间的关系
    PHP中多线程处理
    EASYUI+MVC4通用权限管理平台前言
    常用企业建站源码
    Oracle数据库同步服务
    Jquery easyui +MVC4 管理信息系统
    《自动化技术中的进给电气传动》1.1节和1.2节读书笔记
    FTP
    Samba
    rsync
  • 原文地址:https://www.cnblogs.com/Menhera/p/8982499.html
Copyright © 2020-2023  润新知