在一个升序数组中添加最少的数字,使得从1--n之间所有的数都能用数组中几个数的和表示

一个Java的笔试题上面遇到的题,当时没有做出来。

拆分:

  • 序列升序
  • 1--n所有的数都要能表示
  • 用数组中数字的和表示
  • 添加最少的数字

思路:这个要先从小的数开始表示,因为大的数可以用小数表示。

1--n是一个连续序列,有个特点是1+2+4=7,用1,2,4可以表示1--7之间的数字。1+2+4+8=15可以表示1--15之内的数字。1+2+4+8+16=31。规律很明显了,每次加上和的后一个数。

1+2+5=8能表示1--8的数字吗?答案是不能,因为1+2=3,而后面添加的是5,所以数字4不能表示。那1+2+4+4=11能够表示1--11的数吗?显然是能的。

验证:采用上述思路,每次所能表达的序列都是由前一个序列添加一个最大的数得到的,这样最后添加的数字一定是最少的。

总结:用S表示前面数字的和,同时S也代表当前能够表达的序列为1--S。从数组左边访问数组如果S>=arr[i],则S+=arr[i]。否则S+=(S+1),同时记录添加的数。S初值为0

代码实现

public class AddMinNum {
	private int[] arr= {5,7,8,10,15,16,17,19,20};
	private int fun(int n){
		int sum=0;//开始到当前位置所有数字的和。
		int num=0;//添加的数字个数。
		int i=0;
		while(sum<n){
			if(i>=arr.length)
				break;
			if(sum>=arr[i]){
				sum+=arr[i++];
				System.out.println("sum="+sum);
			}else{
				int tmp=sum+1;
				System.out.println("sum="+sum+" add:\t"+tmp);
				sum+=tmp;
				num+=1;
			}
		}
		while(sum<n){
			int tmp=sum+1;
			System.out.println("sum="+sum+" add:\t"+tmp);
			sum+=tmp;
			num+=1;
		}
		return num;
	}
	public static void main(String[] args) {
		System.out.println("n=100 => min="+new AddMinNum().fun(100));
	}
}

  

结果

原文地址:https://www.cnblogs.com/suen061/p/10585473.html

时间: 2024-08-05 01:45:38

在一个升序数组中添加最少的数字,使得从1--n之间所有的数都能用数组中几个数的和表示的相关文章

在VC工程中添加多语言支持[转]

随着贸易国际化,在软件开发过程中,常会碰到需在现有中文版软件加入多语言支持的情况.由于不同语言版本间的差别通常仅是软件操作界面的不同,为实现多语言支持,使用纯资源DLL是一个不错的解决之道.所谓纯资源DLL是指只包含资源的DLL,譬如:快捷键.对话框.字符串.菜单.工具条.位图.图标.版本信息等等. 具体做法是:利用VC可视化编辑环境为每种语言制作一套资源ID一一对应的资源集并编译生成DLL文件.应用程序初始化时按预设的语言设置选择合适的资源DLL调入,使用资源时依据资源ID进行访问,这样即可实

VS2010的MFC对话框程序中添加菜单栏的过程

VS2010的MFC对话框程序中添加菜单栏的过程 最近在看一个用MFC写的界面的项目的代码,在代码和界面中一直没有看到关于菜单控件是如何添加进对话框的,于是就百度了下.结果,与其它控件(Button等)添加的方式不一样: VS2010的MFC对话框程序中添加菜单栏的过程大致分了这五步. 一.将Menu加入Resource视图中 在WorkSpace中的Resource视图下,在左边目录的任意位置上,先右键-->选择Insert Resource(插入资源)选项,在弹出的对话框中选择Menu以后,

基于MFC对话框程序中添加菜单栏 (CMenu)

vs2013MFC对话框程序中添加菜单栏的过程,我大致分了这五步. 一.将Menu加入Resource视图中 在WorkSpace中的Resource视图下,在任意一个文件夹图标上,右击选择Insert(插入)选项,在弹出的对话框中选择Menu以后,再点击,new按钮,菜单就会添加成功了,但是现在还没有完成,还不能进行编译,因为现在的菜单时空的,在编译的时候会被清除的. 二.用菜单编辑器添加菜单栏及菜单项 菜单添加成功后,菜单编辑器自动打开,可以在其中添加菜单栏及菜单项,比较简单. 三.将菜单加

如何在网页中添加视频?怎样在网页中添加视频

在网页中添加视频的方法今天终于实现了,为了能让那些需要在网页中自由播放自己的视频的朋友收到这个文章,我把标题写的长了点.首先说一下需求,在之前做的一个静态页面中,要加入一个视频,要求自动播放,还要能暂停,有播放进度的功能,但是在百度上很久,一直没有找到这个问题,可能自己太笨了,后来,没有办法,就引用了优酷的连接,但是这样在去掉广告的情况下,还是经常.偶尔会出现广告,这个很让人火大,因为本身自己就是广告,优酷在放30秒,基本人家已经跳出这个网页了,今天终于在别人的网页中看到了一段代码,于是一搜,找

RDLC中添加参数,用来显示报表中数据集之外的信息。

我添加了两个参数,首先后台: ReportParameter rp = new ReportParameter("SignInTime", new DateTime(2001,01,01).ToString()); ReportParameter rp1 = new ReportParameter("Types", "本季度"); reportViewer.LocalReport.SetParameters((new ReportParamete

在网页中添加qq客服

在网页中添加qq图标,点击图标可以直接进入qq聊天界面,比想象中的简单很多,代码如下: <a target="_blank" href="tencent://message/?uin=1434677239&Site=www.baidu.com&Menu=yes" title="在线客户"><img src="online_arrow.gif" width="50" heig

在caffe中添加新的layer

比如现在要添加一个vision layer,名字叫Ly_Layer:(一般命名第一个字母大写,其余小写.) 1.属于哪个类型的layer(共五种:common_layer, data_layer, loss_layer, neuron_layer, vision_layer ),就打开哪个 hpp文件(caffe-master/include/caffe/),这里就打开vision_layers.hpp,然后自己添加该layer的定义,或者直接复制Convolution_Layer的相关代码来修

场景中添加图层

一:GameScene中添加一个Layer图层 1:GameScene.h中定义两个结点 cocos2d::Node *rootNode; cocos2d::Node *BL_rootNode; 2:GameScene.cpp的init函数中添加两结点 //获取visibleSize visibleSize=Director::getInstance()->getWinSize(); //rootNode获取添加 rootNode = CSLoader::createNode("GameS

Android settings.db数据库中添加一条新的默认配置项

Settings数据存放在com.android.providers.settings/databases/settings.db 中 数据库中数据的默认数据在frameworks/base/packages/SettingsProvider/res/values/defaults.xml中定义,如果要在数据库中添加一个新的字段,则可用如下步骤: 1.在defaults.xml中为新加的数据定义一个默认值(如def_mtk_off_flag)(当然也可在代码中直接给定) 2.在framework