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 ...
随机推荐
- Nginx常见的错误配置
Blog:博客园 个人 翻译自Common Nginx misconfigurations that leave your web server open to attack Nginx是当前主流的W ...
- JS(ES6)、Vue.js、node.js
JS行为(ESMAScript, JSdom, bom)$.ajax() <- (xmlhttpRequest由这个封装来的) -> axios(vue版) = ajax技术jque ...
- MySQL深入研究--学习总结(5)
前言 接上文,继续学习后续章节.细心的同学已经发现,我整理的并不一定是作者讲的内容,更多是结合自己的理解,加以阐述,所以建议结合原文一起理解. 第20章<幻读是什么,幻读有什么问题?> 先 ...
- Oment++ 初学者教程 第4节-将其转变为真实网络
4.1两个以上的节点 现在,我们将迈出一大步:创建几个tic模块并将它们连接到网络中.现在,我们将使它们的工作变得简单:一个节点生成一条消息,其他节点继续沿随机方向扔消息,直到它到达预定的目标节点为止 ...
- 庐山真面目之十二微服务架构基于Docker搭建Consul集群、Ocelot网关集群和IdentityServer版本实现
庐山真面目之十二微服务架构基于Docker搭建Consul集群.Ocelot网关集群和IdentityServer版本实现 一.简介 在第七篇文章<庐山真面目之七微服务架构Consul ...
- 普通 Javaweb项目模板的搭建
普通 Javaweb项目模板的搭建 1. 创建一个web项目模板的maven项目 2.配置 Tomcat 服务器 3.先测试一下该空项目 4.注入 maven 依赖 5.创建项目的包结构 6.编写基础 ...
- HTML特殊标签
一,HTML特殊标签 二,换行标签 <br>标签用来将内容换行,其在HTML网页上的效果相当于我们平时使用word编辑文档时使用回车换行. 三,分割线 <hr>标签用来在HTM ...
- ss 命令简介
1. 简介 ss 使用 netlink 与内核 tcp_diag 模块通信获取 socket 信息,用法和输出结果类似于 netstat 命令 语法格式如下 ss [options] [ FILTER ...
- [GDKOI2021] 普及组 Day1 总结
[ G D K O I 2021 ] 普 及 组 D a y 1 总 结 [GDKOI2021] 普及组 Day1 总结 [GDKOI2021]普及组Day1总结 长达3天的快乐GDKOI2021普及 ...
- 北航OO第一单元作业总结(Retake)
前言:当我写这篇博客的时候,我的心情是复杂的,因为这实际上是我第二次写这篇博客--我今年重修的这门课.我对去年的成绩心有不甘--在激烈的竞争下,我虽然尽可能完成了所有作业(仅一次作业未通过弱测),但爆 ...