返回信息流头条笔试题目:
初始定义s=1, m=1
定义两个操作A和B:
A. m = s, s = s + s
B. s = s + m
输入 n, 输出所需要的最小的操作次数,使得 s = n.
例:
输入 n = 6
输出 3
解释 得到s=6的最短操作序列为 AAB, 故输出3
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #95177同步于 2018/3/24
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖
头条机试题第2题 求除DFS外更简单的做法
byrkight
2018/3/24镜像同步25 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
我能想到的
result[s][m] = 1 + min(result[s / 2][s / 2], result[s - m][m])
结果为
min(result[n][1...n])
public int times(int n){
if(n==1) return 0;
int one=0,two=0;
while(n%3==0 && n>0){
one++;
two++;
n = n / 3;
}
while(n%2==0 && n>0){
one++;
n = n / 2;
}
int prime = 0;
if(n>1) prime = n-1;
return one+two+prime;
}
不知道通过率几许
这个矩阵感觉没办法初始化,s/2 可能能比m大,所以不能从左往右,从右往左也不好初始化
【 在 Nroskill 的大作中提到: 】
: 我能想到的
: result[s][m] = 1 + min(result[s / 2][s / 2], result[s - m][m])
: 结果为
: ...................
第一个操作是在往后面加0,第二个操作是能够直接改变数的。比如44对应二进制为101100,可以先用操作一得到1000,此时m为100,之后只能用操作二来得到101100。时间复杂度为O(logn)
也可能存在m=1100的情况,在操作2的时候可以加速
【 在 l11x0m7 的大作中提到: 】
: 第一个操作是在往后面加0,第二个操作是能够直接改变数的。比如44对应二进制为101100,可以先用操作一得到1000,此时m为100,之后只能用操作二来得到101100。时间复杂度为O(logn)
其实就是求最短序列(质数序列乘法问题)
序列A出现,数字*2倍
序列AB出现,数字*3倍
序列ABB出现,数字*4倍
序列ABBB出现,数字*5倍
序列A(B*N)出现,数字*(N-2)倍
还有,4,6,8这些非质是没有价值的,比如8可以通过2?2?2
细节就不显示了,抛砖引玉,你应该可以理解
A出现是最优的价值,所以如果n是质数,那么就返回n-1
如果n不是质数,那么通过上述方式,直到质数k,然后算上上述每个序列用次数,k-1+total即可