题意:

      给你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贪心(最快上升倍率,好题)的更多相关文章

  1. grep之字符串搜索算法Boyer-Moore由浅入深(比KMP快3-5倍)

    这篇长文历时近两天终于完成了,前两天帮网站翻译一篇文章“为什么GNU grep如此之快?”,里面提及到grep速度快的一个重要原因是使用了Boyer-Moore算法作为字符串搜索算法,兴趣之下就想了解 ...

  2. Hadoop3.0新特性介绍,比Spark快10倍的Hadoop3.0新特性

    Hadoop3.0新特性介绍,比Spark快10倍的Hadoop3.0新特性 Apache hadoop 项目组最新消息,hadoop3.x以后将会调整方案架构,将Mapreduce 基于内存+io+ ...

  3. delphi-json组件,速度非常快,要比superobject快好几倍

    delphi-json组件,速度非常快,要比superobject快好几倍https://github.com/ahausladen/JsonDataObjectshttp://bbs.2ccc.co ...

  4. OpenCV Haar AdaBoost源代码改进(比EMCV快6倍)

    这几天研究了OpenCV源代码 Haar AdaBoost算法,作了一下改进 1.去掉了全部动态分配内存的操作.对嵌入式系统有一定的速度提升 2.凝视覆盖了大量关键代码 3.降低了代码一半的体积,而且 ...

  5. grep之字符串搜索算法Boyer-Moore由浅入深(比KMP快3-5倍)(转)

    这篇长文历时近两天终于完成了,前两天帮网站翻译一篇文章“为什么GNU grep如此之快?”,里面提及到grep速度快的一个重要原因是使用了Boyer-Moore算法作为字符串搜索算法,兴趣之下就想了解 ...

  6. 一个比Spring Boot快44倍的Java框架!

    最近栈长看到一个框架,官方号称可以比 Spring Boot 快 44 倍,居然这么牛逼,有这么神奇吗?今天带大家来认识一下. 这个框架名叫:light-4j. 官网简介:A fast, lightw ...

  7. 比MR至少快5倍的神器,竟然是它

    Hive简介 Hive是一个基于 Hadoop 的开源数据仓库工具,用于存储和处理海量结构化数据.它最初是应Facebook对每天产生的海量新兴社会网络数据进行管理和机器学习的需求而产生和发展的,Hi ...

  8. 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. ...

  9. Protobuf有没有比JSON快5倍?用代码来击破pb性能神话

    转 http://www.sohu.com/a/136487507_505779 2017-04-26 07:58 程序设计 /58 /技术 导读:Google 的 Protocol Buffers ...

随机推荐

  1. a标签不能继承父级的颜色

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. 腾讯云容器服务 TKE 拿下新加坡 MTCS 最高级别安全认证

    近日,腾讯云容器服务 TKE 荣获新加坡 MTCS 最高级安全认证,标志着腾讯云 TKE 在为用户提供可靠.易部署.灵活扩展等基础服务上,已经全面满足了新加坡监管机构以及多个行业客户对服务安全的要求. ...

  3. 解决:layUI数据表格+简单查询

    解决:layUI数据表格+简单查询 最近在用layui写项目,在做到用户查询时,发现在layui框架里只有数据表格,不能增加查询.于是自己摸索了一下,写个笔记记录一下. 我想要的效果: 1.定义查询栏 ...

  4. SVHN数据集 Format1 剪裁版

    SVHN数据集官网:http://ufldl.stanford.edu/housenumbers/ SVHN数据集官方提供的有两种格式 Format1是那种在街上拍的照片,每张照片的尺寸都不同,然后l ...

  5. IDEA修改jar包中class文件后重新生成jar包

    一.背景 最新想要修改rebeyond大佬的冰蝎项目,特地去网上搜索如何修改jar包中的源码再替换回去的方法,但由于现在的一些文章写的太烂,导致走了很多弯路,因此写下这篇快速使用IDEA修改源码并替换 ...

  6. Java方法:命令行传参,重载,可变参数,递归

    Java方法:System.out.println()//系统类.out对象.输出方法Java方法是语句的集合,他们在一起执行一个功能方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中 ...

  7. apk签名、包名

    //通过各手机管理软件,如如360.豌豆荚等查看 //使用命令行,可以查看到permission.packagename.title.versionCode等 aapt dump badging ~/ ...

  8. .NET团队送给.NET开发人员的云原生学习资源

    企业正在迅速采用云的功能来满足用户需求,提高应用程序的可伸缩性和可用性.要完全拥抱云并优化节约成本,就需要在设计应用程序时考虑到云的环境,也就是要用云原生的应用开发方法.这意味着不仅要更改应用程序的构 ...

  9. effective解读-第八条 避免使用finalizer和Cleaner

    java9之前finalizer,java9使用cleaner代替了finalizer.相比finalizer,cleaner(它存在于一个独立类Cleaner中,需要时候注入到对应类中即可)不会污染 ...

  10. 高仿京东到家APP引导页炫酷动画效果

    前言 京东到家APP的引导页做的可圈可点,插画+动效,简明生动地说明了APP最吸引用户的几个亮点(商品多,价格低,配送快...).本文主要分析拆解这些动画效果,并完成一个高仿Demo,完整的Demo代 ...