博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeforces : Increase and Copy 解题思路【数学】
阅读量:4047 次
发布时间:2019-05-25

本文共 716 字,大约阅读时间需要 2 分钟。

题目大意:

刚开始有个数组,只有一个1,你可以进行两个操作:

1.把一个数复制到序列后面。
2.把一个数加上1。
你的任务是,通过上述操作,使所有数之和为一个给定值x,要求使操作次数尽可能小。

思考过程:

经过一段时间的摸索,不难发现,最优策略应该是:把1加到某个数,然后复制这个数,最后再把剩余的数加上去,直到得出结果。

经过摸♂索,我发现,要加到的这个数就是 根号x。
具体怎么证明可以看其它的大佬的博客,我的重点是细节处理
(其实是太菜了)

具体实现:

令s=sqrt(x)(向下取整)

首先要先加上s-1次
然后再加上s/(x-s)次
重点是后面:
s不一定每次都会被x整除
所以大多数情况下会省一个数,所以我们可以在把1往上加的时候,当它等于x%s的时候,复制一下,所以总次数会加一。加入能够整除,就不用加一了。

代码:

#include
#include
#include
using namespace std;int n;int main(){
scanf("%d",&n); for(int i=1;i<=n;++i){
int x;scanf("%d",&x); int s=sqrt(x); printf("%d\n",s-1+x/(s-x)+(x%s!=0)); } return 0;}

一些思考:

比赛的时候知道要加到sqrt(x),但是一直细节处理不好,归根到底,还是不知道怎么去分类讨论,所以这方面要多去考虑考虑。

觉得累了就来康康我老婆吧

在这里插入图片描述

转载地址:http://vuuci.baihongyu.com/

你可能感兴趣的文章
使用file查看可执行文件的平台性,x86 or arm ?
查看>>
qt5 everywhere 编译summary
查看>>
qt 创建异形窗体
查看>>
可重入函数与不可重入函数
查看>>
简单Linux C线程池
查看>>
内存池
查看>>
输入设备节点自动生成
查看>>
GNU hello代码分析
查看>>
Qt继电器控制板代码
查看>>
wpa_supplicant控制脚本
查看>>
gstreamer相关工具集合
查看>>
RS232 四入四出模块控制代码
查看>>
linux 驱动开发 头文件
查看>>
/etc/resolv.conf
查看>>
container_of()传入结构体中的成员,返回该结构体的首地址
查看>>
linux sfdisk partition
查看>>
ipconfig,ifconfig,iwconfig
查看>>
opensuse12.2 PL2303 minicom
查看>>
网络视频服务器移植
查看>>
Encoding Schemes
查看>>