描述
现有n种砝码,重量互不相等,分别为 m1,m2,m3…mn ;
每种砝码对应的数量为 x1,x2,x3...xn 。现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。
注:
称重重量包括 0
输入描述:
对于每组测试数据:
第一行:n --- 砝码的种数(范围[1,10])
第二行:m1 m2 m3 ... mn --- 每种砝码的重量(范围[1,2000])
第三行:x1 x2 x3 .... xn --- 每种砝码对应的数量(范围[1,10])
输出描述:
利用给定的砝码可以称出的不同的重量数
示例:
输入:
2
1 2
2 1
输出:
5
说明:
可以表示出0,1,2,3,4五种重量。
解:
let line1 = readline();let line2 = readline();let line3 = readline();
let m = line2.split(' '); //每种砝码的重量
let x = line3.split(' '); //每种砝码对应的数量范围
let fama = [] //序列化砝码,比如两个1g和一个2g的砝码用[1,1,2]表示
for (let i = 0; i < m.length; i++) {
for (let j = 0; j < x[i]; j++) {
fama.push(Number(m[i]))
}
}
let kind = new Set(); //用set表示加入当前砝码之前能产生的重量种类
kind.add(0); //set初始化为0
// 当第一个1g砝码放入时,set中要插入原先所有元素+1g后的结构,即{0,0+1},插入后变为{0,1}
// 当第二个1g砝码放入时,set要插入{0+1,1+1},变为{0,1,2}
// 第三个2g砝码放入时,set要插入{0+2,1+2,2+2},变为{0,1,2,3,4}
for (let i = 0; i < fama.length; i++) {
let arr = [...kind] //用一个数组来缓存当前种类的砝码的值
for (let k of arr) {
kind.add(k + fama[i]);
}
}
console.log(kind.size)
——————————————————————
描述
正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。
数据范围:1 \le a,b \le 100000 \ 1≤a,b≤100000
输入描述:
输入两个正整数A和B。
输出描述:
输出A和B的最小公倍数。
输入:5 7
输出:35
解:let arr=readline().split(' ').sort((a,b)=> a-b)
let res=[]
let n=arr[1]
while(!(n%arr[0]==0 && n%arr[1]==0)){
n++
}
console.log(n)
————————————————————
描述
任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对。
数据范围:输入的数据满足 4 \le n \le 1000 \ 4≤n≤1000
输入描述:
输入一个大于2的偶数
输出描述:
从小到大输出两个素数
示例1
输入:20
输出:
7
13
示例2
输入:4
输出:
2
2
解:let num=readline()
let res=[]
let arr={}
for(var j=num;j>1;j--){
arr[j]=[]
for(var i=2;i<num;i++){
if(j%i==0){
arr[j].push(i)
}
}
}
for(var k in arr){
if ( arr[k].length==1){
res.push(k)
}
}
let obj={}
for(var i=0;i<res.length;i++){
for(var j=res.length-1;j>=i;j--){
if(res[i]*1+res[j]*1==num){
obj[(`${res[j]}-${res[i]}`)]=(`${res[j]-res[i]}`)
}
}
}
let min=num
for(var k in obj){
min=Math.min(min,obj[k])
}
for(var k in obj){
if(obj[k]==min){
let hh=k.split('-')
console.log(hh[1])
console.log(hh[0])
}
}
————————————————————————————
//第一题3空瓶换气水,两个空瓶可以和老板借一瓶,最多能换多少瓶汽水
// let num = 1;
// let sum = 0;
// function ping(e) {
// let n = parseInt(e / 3);
// let m = e % 3;
// if (n !== 0) {
// sum += n;
// let i = n + m;
// ping(i);
// }
// if (n == 0 && m == 2) {
// sum = sum + 1;
// console.log(sum);
// }
// if (n == 0 && (m == 0 || m == 1)) {
// console.log(sum);
// }
// }
// ping(num);
——————————————————————————————
题目描述
小明从糖果盒中随意抓一把糖果,每次小明会取出一半的糖果分给同学们。
当糖果不能平均分配时,小明可以选择从糖果盒中(假设盒中糖果足够)取出一个糖果或放回一个糖果。
小明最少需要多少次(取出、放回和平均分配均记一次),能将手中糖果分至只剩一颗。
输入描述:
抓取的糖果数(<10000000000):15
输出描述:
最少分至一颗糖果的次数:5
示例 1
输入:15
输出:5
解释:
(1) 15+1=16;
(2) 16/2=8;
(3) 8/2=4
(4)4/2=2
(5)2/2=1
解:let num = 15;
let arr = [];
function f(e, sum) {
if (e == 1) {
arr.push(sum);
return;
}
if (e % 2 == 0) {
sum++;
f(e / 2, sum);
} else {
sum++;
f(e - 1, sum);
f(e + 1, sum);
}
}
f(num, 0);
arr.sort((a, b) => a - b);
console.log(arr[0]);