hdu4038贪心(最快上升倍率,好题)
题意:
给你n个数,然后有两种操作 1.给其中的一个数+1,2.在序列里面增加一个1,然后给你一个m,表示进行了m次操作,最后问你操作之后所有数乘积最大是多少?
思路:
徒弟给我的一个题目,感觉不错,这个题目细节比较多,至于难度,感觉还行,值得做一做,大体思路就是模拟,有点贪心的意思,首先我们要看看负数的个数,如果是奇数个,那么要把其中的一个绝对值最小的负数,也就是那个最大的负数变成正数,然后继续,如果是偶数个那么直接继续,接下来我们要把所有的0变成1,然后把所有的1变成2,然后把所有的2变成3,然后如果还有剩余步数,那么我们把他尽可能变成3,然后是2,如果这个时候还剩余怎么办?在剩余也就是肯定剩一个了,那么我们就把他加到当前的最小的那个数上,当前最小的那个数只有两种可能,要么是3,要么是比三大的数,这个自己想,上面的步骤中如果m在某个环节用没了,那么就停止然后统计答案就行了,下面说下,为什么3是关键呢?
我的想法是这样,我们可以考虑增加的倍率,如果是0那么+1这个肯定是最优的,如果是1增加1也是当前最合适的,因为直接增加一倍,继续往下会发现到3的时候在增加就没有直接在虚拟出来一个3合适了,大体是下面那样
1 > 0
2/1 * 2/1 > 2
3/2 * 3/2 * 3/2 > 3
4/3*4/3*4/3*4/3 < 4
我是这么推的 不知道对不对
然后就是细节,各种细节要注意,比如3^X,这个X目测很大,为了不超时建议快速幂,还有就是数据范围,还有就是负数取余的问题...
#include<stdio.h>
#include<algorithm>
#define MOD 1000000007
__int64 X[100005];
__int64 Pow(__int64 a ,__int64 b)
{
__int64 c = 1;
while(b)
{
if(b&1) c = c * a % MOD;
a = a * a % MOD;
b /= 2;
//printf("%I64d %I64d %I64d*\n" ,a ,b ,c);
}
return c;
}
int main ()
{
int t ,n ,cas = 1 ,i;
__int64 m ,Ans;
scanf("%d" ,&t);
while(t--)
{
scanf("%d %I64d" ,&n ,&m);
printf("Case %d: " ,cas ++);
__int64 sf = 0 ,s0 = 0 ,s1 = 0 ,s2 = 0 ,s3 = 0;
__int64 Max= 0 ,Maxid = -1;
__int64 Min = 0 ,Minid = -1;
for(i = 1 ;i <= n ;i ++)
{
scanf("%I64d" ,&X[i]);
if(X[i] >= 3 && Minid == -1 || Min > X[i])
{
Min = X[i];
Minid = i;
}
if(X[i] < 0)
{
sf ++;
if(Max == 0 || Max < X[i])
Max = X[i] ,Maxid = i;
}
if(X[i] == 0) s0 ++;
if(X[i] == 1) s1 ++;
if(X[i] == 2) s2 ++;
}
if(sf % 2)
{
if(m <= -Max)
{
X[Maxid] += m;
Ans = 1;
for(i = 1 ;i <= n ;i ++)
Ans = Ans * X[i] % MOD;
printf("%I64d\n" ,Ans);
continue;
}
s0 ++ ,m += Max;
}
else Maxid = -1;
if(m >= s0)
{
s1 += s0;
m = m - s0;
s0 = 0;
}
else
{
s1 += m;
s0 = s0 - m ;
m = 0;
}
if(m >= s1)
{
s2 += s1;
m = m - s1;
s1 = 0;
}
else
{
s2 += m;
s1 = s1 - m ;
m = 0;
}
if(m >= s2)
{
s3 += s2;
m = m - s2;
s2 = 0;
}
else
{
s3 += m;
s2 = s2 - m ;
m = 0;
}
s3 += m / 3;
s2 += m % 3 / 2;
Ans = 1;
if(m % 3 % 2)
{
if(s3)
{
s3 --;
Ans = 4;
}
else
for(i = 1 ;i <= n ;i ++)
if(i == Minid) X[i] ++;
}
if(s0)
{
printf("0\n");
continue;
}
Ans = Ans * Pow(2 ,s2) % MOD * Pow(3 ,s3) % MOD;
for(i = 1 ;i <= n ;i ++)
{
if(i == Maxid || X[i] == 0 || X[i] == 1 || X[i] == 2)
continue;
if(X[i] < 0) X[i] *= -1;
Ans = Ans * X[i] % MOD;
}
printf("%I64d\n" ,Ans);
}
return 0;
}
hdu4038贪心(最快上升倍率,好题)的更多相关文章
- grep之字符串搜索算法Boyer-Moore由浅入深(比KMP快3-5倍)
这篇长文历时近两天终于完成了,前两天帮网站翻译一篇文章“为什么GNU grep如此之快?”,里面提及到grep速度快的一个重要原因是使用了Boyer-Moore算法作为字符串搜索算法,兴趣之下就想了解 ...
- Hadoop3.0新特性介绍,比Spark快10倍的Hadoop3.0新特性
Hadoop3.0新特性介绍,比Spark快10倍的Hadoop3.0新特性 Apache hadoop 项目组最新消息,hadoop3.x以后将会调整方案架构,将Mapreduce 基于内存+io+ ...
- delphi-json组件,速度非常快,要比superobject快好几倍
delphi-json组件,速度非常快,要比superobject快好几倍https://github.com/ahausladen/JsonDataObjectshttp://bbs.2ccc.co ...
- OpenCV Haar AdaBoost源代码改进(比EMCV快6倍)
这几天研究了OpenCV源代码 Haar AdaBoost算法,作了一下改进 1.去掉了全部动态分配内存的操作.对嵌入式系统有一定的速度提升 2.凝视覆盖了大量关键代码 3.降低了代码一半的体积,而且 ...
- grep之字符串搜索算法Boyer-Moore由浅入深(比KMP快3-5倍)(转)
这篇长文历时近两天终于完成了,前两天帮网站翻译一篇文章“为什么GNU grep如此之快?”,里面提及到grep速度快的一个重要原因是使用了Boyer-Moore算法作为字符串搜索算法,兴趣之下就想了解 ...
- 一个比Spring Boot快44倍的Java框架!
最近栈长看到一个框架,官方号称可以比 Spring Boot 快 44 倍,居然这么牛逼,有这么神奇吗?今天带大家来认识一下. 这个框架名叫:light-4j. 官网简介:A fast, lightw ...
- 比MR至少快5倍的神器,竟然是它
Hive简介 Hive是一个基于 Hadoop 的开源数据仓库工具,用于存储和处理海量结构化数据.它最初是应Facebook对每天产生的海量新兴社会网络数据进行管理和机器学习的需求而产生和发展的,Hi ...
- MySQL 8.0 正式版 8.0.11 发布:比 MySQL 5.7 快 2 倍
ySQL 8.0 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 注意:从 MySQL 5.7 升级到 MySQL 8. ...
- Protobuf有没有比JSON快5倍?用代码来击破pb性能神话
转 http://www.sohu.com/a/136487507_505779 2017-04-26 07:58 程序设计 /58 /技术 导读:Google 的 Protocol Buffers ...
随机推荐
- 模式识别Pattern Recognition
双目摄像头,单目摄像头缺少深度 Train->test->train->test->predicive
- MyBatis(二):自定义持久层框架思路分析
使用端 引入架构端Maven依赖 SqlMapConfig.xml-数据库配置信息(数据库连接jar名称.连接URL.用户名.密码),引入Mapper.xml的路径 XxMapper.xml-SQL配 ...
- P2023 [AHOI2009]维护序列 题解(线段树)
题目链接 P2023 [AHOI2009]维护序列 解题思路 线段树板子.不难,但是...有坑.坑有多深?一页\(WA\). 由于乘法可能乘\(k=0\),我这种做法可能会使结果产生负数.于是就有了这 ...
- WorkSkill整理之 技能体系
- Django之缓存、信号和图片验证码、ORM性能
一. 缓存 1. 介绍 缓存通俗来说:就是把数据先保存在某个地方,下次再读取的时候不用再去原位置读取,让访问速度更快. 缓存机制图解 2.Django中提供了6种缓存方式 1. 开发调试 2. 内存 ...
- docker使用常见问题解决方案:错误号码2058,docker WARNING :IPv4,容器间的通讯
1.错误号码2058 1,错误解决: 解决方法:docker下mysql容器 登录 mysql -u root -p 登录你的 mysql 数据库,然后 执行这条SQL: ALTER USER 'ro ...
- oCPC中转化率模型与校准
翻看日历时间已经来到了2021年,也是共同战役的第二年,许久没有更新文章了,在与懒惰进行过几次斗争都失利之后,今天拿出打工人最后的倔强,终于收获了一场胜利.闲话不多说,今天咱们重点聊聊oCPC中转化率 ...
- 翻译:《实用的Python编程》08_01_Testing
目录 | 上一节 (7.5 装饰方法 | 下一节 (8.2 日志) 8.1 测试 多测试,少调试(Testing Rocks, Debugging Sucks) Python 的动态性质使得测试对大多 ...
- 运行ASP.NET程序(4)
运行ASP.NET程序有两种方式: 直接点击如图标志的按钮可直接运行,还可以选择浏览器 第二种:F5 两者没区别,看个人习惯
- Java中对象的生与灭- 核心篇
前言 大家好啊,我是汤圆,今天给大家带来的是<Java中对象的生与灭- 核心篇>,希望对大家有帮助,谢谢 文章纯属原创,个人总结难免有差错,如果有,麻烦在评论区回复或后台私信,谢啦 简介 ...