链接
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2379
题目大意
项数列 ,每次可以选择任何几个数减去相同的值,问你最少几次全变成
题解
其实答案取决于一开始又多少不同的值,如果操作之后值变多了,那这次操作肯定是不对的,只会徒增花费。
看一下
1 2 3
1 0 1
0 0 0
两次变成全0,所以答案是2
看一下
1 2 3 4
1 2 0 1
0 2 0 0
0 0 0 0
答案是
从这里就可以看出,我第一步执行完之后,就变成了f[2]的子问题
所以我只需要确定递推关系即可
对于
为奇数,我只要从第
项开始减去
,就变成
的子问题,且
对于
为偶数,我只要从第
项开始减去
,就转化成了
的子问题,
综上
,
时间复杂度
代码
#include <cstdio>
int dfs(int n)
{
if(n==0)return 0;
return dfs(n/2)+1;
}
int main()
{
int n;
while(~scanf("%d",&n))printf("%d\n",dfs(n));
return 0;
}