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 ...
随机推荐
- CCF(除法):线段树区间修改(50分)+线段树点修改(100分)+线段树(100分)
除法 201709-5 这道题有很多种方法来做,最常用的就是线段树和树状数组. 如果使用线段树来做,就会想到区间修改的update函数.但是这里可能会涉及到v是1或者a[j]是0的情况,所以用这种方法 ...
- 04----python入门----文件处理
一.大致介绍 我们在计算机上进行的操作,归根结底是对文件的操作,其实质是由操作系统发送请求,将用户或者应用程序对文件读写操作转换成具体的硬盘指令. 众所周知,内存中的数据是无法永久保存的.在计算机硬件 ...
- 计算机二级Python学习笔记(一):温度转换
今天通过一个温度转换的十行代码,理解了一些Python的基本元素. 所谓温度转换,就是摄氏度和华氏度的转换,要求输入摄氏度,可以输出华氏度,反之一样能实现.代码如下: #TempConvert.py ...
- 微软跨平台UI框架MAUI真的要来啦
.NET 6 preview已经上线,是时候为在BUILD 2020上宣布的新.NET Multi-platform App UI(MAUI)做准备了.对于客户端应用程序开发人员来说,这一年.NET有 ...
- 详解 ZooKeeper 数据持久化
本文作者:HelloGitHub-老荀 Hi,这里是 HelloGitHub 推出的 HelloZooKeeper 系列,免费开源.有趣.入门级的 ZooKeeper 教程,面向有编程基础的新手. 项 ...
- 依赖反转原则DIP 与使用了Repository模式的asp.net core项目结构
DIP 依赖反转原则 Dependency Inversion Principle 的定义如下: 高级别的模块不应该依赖于低级别的模块, 他们都应该依赖于抽象. 假设Controller依赖于Repo ...
- Java学习之路 -- Java怎么学?
@ 目录 java基础怎么学? 学完基础学什么? 几个常用框架学完学什么? MQ JVM的知识跑不掉 微服务等等 其他 数据结构和算法 java基础怎么学? 当时,作为懵懂的小白,大一学习了c和c++ ...
- OpenCV图像处理中的“机器学习"技术的使用
注意,本文中所指"机器学习"(ML)技术,特指SVM.随机森林等"传统"技术. 一.应用场景 相比较当下发展迅速的各路"端到端" ...
- Nacos 2.0 正式发布,性能提升了 10 倍!!
前不久,在3月20号,Nacos 2.0.0 正式发布了!我简单看了下官方的介绍,可能nacos未来逐渐会成为各大公司作为服务治理和配置中心的主要中间件. Nacos 简介:一个更易于构建云原生应用的 ...
- 【剑指offer】9:变态跳台阶
题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 解题思路: 先考虑最简单情况就是只有一级台阶,仅有一种跳法.两级台阶,有两种 ...