C. Kevin's Meme Reacts(UTPC Contest 11-06-20 Div. 2 (Beginner))

 

 

 

 

 

题意

  这题大体意思就是你一开始给一个数1,之后每一天这个数都会自乘2,并且你可以在其中的任意一天把这个数加1,以此来得到你最终想要的数n,并且要求操作次数最少。

  题目链接:https://codeforces.com/gym/102830/problem/C

解析

  这种题其实遇到过好多次了,但是每次都想着下一次一定查题解结果拖到了自己把这种题解出来。

  可以理解为一种贪心算法,如果想得到这个数n,并且要求其操作数最少,就要尽量的少加1。

  即如果n为偶数就一直除以2,直到其为奇数;

  若n为奇数且不为1,就减一除以2,同时操作数加1;

  最后这两种情况都会化为1,所有在程序的最后加1。

AC代码

#include<iostream>
using namespace std;
int main()
{
    long long n;
    scanf("%lld",&n);
    long long op=0;
    if(n==1||n==2)
    {
        printf("1\n");
        return 0;
    }
    for(long long i=0;1;i++)
    {
        if(n==2||n==1)
        {
            op++;
            break;
        }
        if(n%2==0)
        {
            n/=2;
            continue;
        }
        else
        {
            op++;
            n--;
            n/=2;
        }
    }
    printf("%lld",op);
    return 0;
}

 

posted @ 2020-12-18 19:19  TheWeak  阅读(145)  评论(0编辑  收藏  举报