nowcoder-第三届湖北省赛-Mr.Maxwell and attractions (贪心)

简介: 一道比较细节的贪心题题意:一个人可以选择在上午上班或者是在下午上班,不上班的时间可以摸鱼游玩有n个室内的风景,m个室外的风景,这n+m个风景有一个漂亮值对于这n+m个风景,如果第一次观看漂亮值转换为开心值比率为100%,如果重复观看,每重复一次就会变成之前的60%对于室外的风景,下午观看会降到80%,上午观看不影响,如果在下午重复观看室外的风景,获得的开心值就是preVal * 80% * 60 %。(效果加成作用)问这个人至少在白天工作k天( >= k),总共n天,最大能获得多少开心值

20210505232710207.png20210505232734169.png


一道比较细节的贪心题


题意:


一个人可以选择在上午上班或者是在下午上班,不上班的时间可以摸鱼游玩

有n个室内的风景,m个室外的风景,这n+m个风景有一个漂亮值

对于这n+m个风景,如果第一次观看漂亮值转换为开心值比率为100%,如果重复观看,每重复一次就会变成之前的60%

对于室外的风景,下午观看会降到80%,上午观看不影响,如果在下午重复观看室外的风景,获得的开心值就是preVal * 80% * 60 %。(效果加成作用)


问这个人至少在白天工作k天( >= k),总共n天,最大能获得多少开心值


输入:


2 1 4 2
4 3
7


输出:


18.20


样例解释:


上午7上午7*0.6下午4下午3

7 + 7 * 0.6 + 4 + 3 == 18.20


很容易想到用优先队列维护两块(室内室外)的风景,每当观看过之后,就对这个值*0.6,因为已经观看过了

然后要在白天工作至少k天,所以也就意味着至少要在下午观赏k天


先来一份Wa的赛事代码,队友实现的非常OK,但是在我们讨论过程中还是细节没有考虑好

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
priority_queue<double,vector<double>,less<double> >q1;//室内
priority_queue<double,vector<double>,less<double> >q2;//室外
int main()
{
    int n,m,k,t; cin >> n >> m >> t >> k;
    for(int i=1;i<=n;i++)
    {
        double x; cin >> x;
        q1.push(x);
    }
    for(int i = 1;i <= m;i++)
    {
        double x; cin >> x;
        q2.push(x);
    }
    k = t - k;
    double ans = 0;
    for(int i = 1;i <= k;i++)
    {
        double x = q1.top();q1.pop();
        double y = q2.top();q2.pop();
        if(x >= y)
        {
            ans += x;
            x *= 0.6;
        }
        else{
            ans += y;
            y *= 0.6;
        }
         q1.push(x);
         q2.push(y);
    }
    k = t - k;
    for(int i = 1;i <= n;i++)
    {
         double x = q1.top();q1.pop();
         double y = q2.top();q2.pop();
         if(x >= y * 0.8){
             ans += x;
             x *= 0.6;
         }
        else{
            ans += y * 0.8;
            y *= 0.6;
        }
        q1.push(x);
        q2.push(y);
    }
    printf("%.2lf",ans);
    return 0;
}


这份代码错就错在,将两部分进行分开考虑,实际上是不应该进行分开考虑的

也就是说:


20210505234126569.png

所以最终Code就很容易啦:


int n,m,t,k;
priority_queue<double> quea,queb;
int main() {
  cin >> n >> m >> t >> k;
  for(int i=1; i<=n; i++) {
    double t; cin >> t;
    quea.push(t);
  }
  for(int i=1; i<=m; i++) {
    double t; cin >> t;
    queb.push(t);
  }
  double ans = 0;
  k = t-k;
  for(int i=1;i<=t;i++){
    double topa = quea.top();
    double topb = queb.top();
    double mul = 1.0;
    if(k <= 0) mul = 0.8;///afternoon 
    if(topa > topb * mul){
      ans += topa;
      quea.pop();quea.push(topa * 0.6);
    }else{
      ans += topb * mul;
      queb.pop();queb.push(topb * 0.6);
      k --;
    }
  }
  printf("%.2lf\n",ans);
  return 0;
}//ac_code


目录
相关文章
|
3天前
|
C++
【PTA】​L1-079 天梯赛的善良​ (C++)
【PTA】​L1-079 天梯赛的善良​ (C++)
72 0
【PTA】​L1-079 天梯赛的善良​ (C++)
|
3天前
(2021 ICPC)亚洲区域赛(昆明)I.Mr. Main and Windmills
(2021 ICPC)亚洲区域赛(昆明)I.Mr. Main and Windmills
14 0
(2021 ICPC)亚洲区域赛(昆明)I.Mr. Main and Windmills
|
10月前
|
人工智能
天梯赛-L1-064 估值一亿的AI核心代码 (20 分)--2019全国CCCC天梯赛L1题解
天梯赛-L1-064 估值一亿的AI核心代码 (20 分)--2019全国CCCC天梯赛L1题解
308 0
|
10月前
|
人工智能 机器人
第10届山东省赛Wandering Robot(详细思路)
第10届山东省赛Wandering Robot(详细思路)
58 0
|
10月前
|
机器学习/深度学习
山东第一届省赛 Balloons (dfs)
山东第一届省赛 Balloons (dfs)
36 0
|
10月前
|
Python
2021 山东省赛 H . Adventurer’s Guild(01背包)
2021 山东省赛 H . Adventurer’s Guild(01背包)
54 0
|
10月前
|
算法
山东第一届省赛 Greatest Number(优雅暴力+二分)
山东第一届省赛 Greatest Number(优雅暴力+二分)
46 1
|
10月前
|
测试技术 C++
【PTA天梯赛】L1-001 L1-002 L1-003 L-004 L-005 L-006 L-007 L-008 L-009 L1-010 c++
【PTA天梯赛】L1-001 L1-002 L1-003 L-004 L-005 L-006 L-007 L-008 L-009 L1-010 c++
177 1
第一届ACC(AcWing Cup)全国高校联赛初赛:个人版题解
第一届ACC(AcWing Cup)全国高校联赛初赛:个人版题解
132 0
第一届ACC(AcWing Cup)全国高校联赛初赛:个人版题解
2020ICPC昆明站——J.Mr. Main and Windmills(计算几何)
2020ICPC昆明站——J.Mr. Main and Windmills(计算几何)
104 0
2020ICPC昆明站——J.Mr. Main and Windmills(计算几何)