CF413C
正文
题意:
给 n 个关卡,每个关卡得分为 ai,有 m 次机会可以选择一
个关卡通过后不得分,而将现有得分翻倍
你可以安排关卡的通过顺序和策略,求最大得分.
分析:
看到这道题首先想到的就是贪心,贪心不仅是最好想也是最好写的。
- 开始我们可以确定的是,如果有个关卡不能翻倍,那你只能把他的分值加上;
- 另外,我们知道,如果基数越大,那他翻倍后的数就越大,
这也是贪心的核心所在,如果我们想要更大的值,就要先得到更大的基数再把它翻倍,所以我们应先把所有只能加的数加起来在翻倍(因为题目给定分值不会为负数); - 还有,在遇到能翻倍的关卡的时候,也要判断一下到底是翻倍后得的分多还是不翻倍加上当前关卡分得的分多。
知道这些了以后,我们可以写代码了
做法
- 我这里是一开始把所有关卡的分全都加上,再减去可以翻倍的关卡的分,作为开始的基数;
- 然后新开一个数组专门存能翻倍的关卡的分,并从大到小排序,还是遵循了先基数大优先的准则,如果把大的放后面,那他能作为基数扩大后面的值的可能性就会变小,所以先放前面并每次比较加上它后的值与翻倍的值,取较大的那个;
- 注意:我这里本来想用计数器记录翻倍关卡的数量,在排序时按照它的数量排,但是我这里赋值后关卡分值在数组里的分布是不定的,有的会排不到,所以要把所有的数组全排一遍。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define maxn 1000010
using namespace std;
long long n,m,a[maxn],b[maxn],c[maxn],cnt,ans;
int cmp(int x,int y){
return x>y;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
ans+=a[i];
}
for(int i=1;i<=m;i++){
cin>>b[i];
for(int j=1;j<=n;j++){
if(b[i]==j){
c[j]=a[b[i]];
ans-=a[b[i]];
cnt++;
}
}
}
sort(c+1,c+n+1,cmp);
for(int i=1;i<=cnt;i++){
if(ans*2>=ans+c[i]) ans*=2;
else ans+=c[i];
}
cout<<ans;
return 0;
}
制作不易,若有错请各位指正
CF413C的更多相关文章
- 【题解】CF413C Jeopardy!
\(\color{blue}{Link}\) \(\text{Solution:}\) 首先,显然的策略是把一定不能翻倍的先加进来.继续考虑下一步操作. 考虑\(x,y\)两个可以翻倍的物品,且\(a ...
随机推荐
- python的22个基本语法
"人生苦短,我用Python".Python编程语言是最容易学习.并且功能强大的语言.只需会微信聊天.懂一点英文单词即可学会Python编程语言.但是很多人声称自己精通Python ...
- 错误总结Mapper扫描不到
Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework ...
- 手摸手带你用Hexo撸博客(三)之添加评论系统
原文地址 注: 笔者采用的是butterfly主题, 主题内置集成评论系统 butterfly主题开启评论 开启评论需要在comments-use中填写你需要的评论. 以Valine为例 commen ...
- 俯瞰Dubbo全局,阅读源码前必须掌握这些!!
写在前面 在上一篇<冰河开始对Dubbo下手了!>一文中,我们重点介绍了为何要学习Dubbo,而且还是要深入理解Dubbo的原理和核心源码.既然是要写深度解析Dubbo源码的系列专题,我们 ...
- 树莓派4B智能小车机器套件——入手组装实验记录
树莓派4B智能小车机器套件--入手组装实验记录 4WD智能小车(4WD SMART ROBOT KIT),支持Arduino.51.STM32.Raspberry Pi等4个版本.本套件采用的是树莓派 ...
- 项目实战--idea中使用Git遇到的坑
问题 在一次代码的更新中,我按照以往的操作点,菜单中VCS下的Update Project,结果报错了,idea自动将我未提交的所有代码驻藏了stash了,全部代码还原了,心里慌了一下,去GitLab ...
- 性能超四倍的高性能.NET二进制序列化库
二进制序列化在.NET中有很多使用场景,如我们使用分布式缓存时,通常将缓存对象序列化为二进制数据进行缓存,在ASP.NET中,很多中间件(如认证等)也都是用了二进制序列化. 在.NET中我们通常使用S ...
- MySQL 标识符到底区分大小写么——官方文档告诉你
最近在阿里云服务器上部署一个自己写的小 demo 时遇到一点问题,查看 Tomcat 日志后定位到问题出现在与数据库服务器交互的地方,执行 SQL 语句时会返回 指定列.指定名 不存在的错误.多方查证 ...
- .NET斗鱼直播弹幕客户端(2021)
.NET斗鱼直播弹幕客户端(2021) 离之前更新的两篇<.NET斗鱼直播弹幕客户端>已经有一段时间,近期有许多客户向我反馈刚好有这方面的需求,但之前的代码不能用了--但网上许多流传的No ...
- leetcode 1593. 拆分字符串使唯一子字符串的数目最大(DFS,剪枝)
题目链接 leetcode 1593. 拆分字符串使唯一子字符串的数目最大 题意: 给你一个字符串 s ,请你拆分该字符串,并返回拆分后唯一子字符串的最大数目. 字符串 s 拆分后可以得到若干 非空子 ...