题目描述
给定一个数n,你的任务是用最少的操作把1,2.......n中的所有数都变成0。每次操作可以从序列中选择一个或多个同时减去一个数。
输入
输入n(n<=100000)
输出
输出最小次数
样例输入
1
2
样例输出
1
2
看不出来就先找找规律
比如:1 2 3 4 5 6
1.后三个同时减去3;1 2 3 1 2 3 ->1 1 2 2 3 3
2.后四个同时减去2;1 1 0 0 1 1 ->0 0 0 0 1 1
3.再减去1;0 0 0 0 0 0 完成!
再多列几个不难发现规律!
每次都要减去的是 最大的数除以2的数 然后num++
E.g. 如上面的例子:第一步除以3(6/2);
第二步减去2(3/2);
第三步减去1 就ok
注意不能减多了让它变成负数的,要刚刚好是0。所以是选择几个数进行减。
#include<stdio.h>
int main()
{
int n;
while(~scanf("%d",&n))
{
int sum=0;
while(n)
{
sum++;
n/=2;
}
printf("%d\n",sum);
}
return 0;
}
代码还是挺简单的