zoukankan      html  css  js  c++  java
  • 全国新生赛——————————1001————————————————

    Problem Description
      小明现在是人见人爱,花见花开的高富帅,整天沉浸在美女环绕的笙歌妙舞当中。但是人们有所不知,春风得意的小明也曾有着一段艰苦的奋斗史。
    
      那时的小明还没剪去长发,没有信用卡没有她,没有24小时热水的家,可当初的小明是那么快乐,尽管甚至没有一把破木吉他…
    
      之所以快乐,是因为那时的小明心怀逆袭梦想。有一天,小明为了给他心目中的女神买生日礼物,来到了某建筑工地搬砖挣钱。就在这个时候,工地上又运来了一卡车的砖,包工头让小明把卡车卸下来的那堆砖分成一块一块的(要求任何2块转都要分开)。作为资深搬运工,小明总是每次将一堆砖分为两堆,这时候,所消耗的体力是分完之后两堆砖数目的差值。
    
      现在,已知卡车运来的砖的数目,请告诉小明最少要花费多少体力才能完成包工头所要求的任务呢?
     
    
    Input
    输入数据第一行是一个正整数T(T<=100),表示有T组测试数据。
    接下来T行每行一个正整数N(N<=10000000),表示卡车运来的砖块的数目。
     
    
    Output
    对于每组数据,请输出小明完成任务所需的最少体力数。
     
    
    Sample Input
    2
    4
    5
     
    
    Sample Output
    0
    2
     
    
    S

    审题之后就认为这是一道给数字出结果的题。根据根有据几块砖,去慢慢的除以而去算,结果发现越算越麻烦。

    #include<stdio.h>
    int main()
    {
        __int64 a,i,n,s;
        scanf("%I64d",&n);
        for(i=0;i<n;i++)
        {
            int q=1;
            scanf("%I64d",&a);
            if(a==1)
            {
                printf("1
    ");
                continue;
            }
            if(a==0)
            {
                printf("0
    ");
                continue;
            }
            else
                if(a%2==0)
                {
                    while(a%2==0)
                    {
                        a=a/2;
                        q=2;
                        if(a==1)
                        {
                            printf("0
    ");
                            break;
                        }
                    }
                    if(a==1)
                        continue;
                    s=0;
                    while(a>0)
                    {
                        a=a/2;
                        if(a%2!=0)
                            ;
                        else
                            a=a+1;
                        s=s+1;
                        if(a==1)
                            break;
                    }
                    printf("%I64d
    ",s*q);
                }
                else
                {
                    s=0;
                    while(a>0)
                    {
                        a=a/2;
                        if(a%2!=0)
                            ;
                        else
                            a=a+1;
                        s=s+1;
                        if(a==1)
                            break;
                    }
                    printf("%I64d
    ",s);
                }
                
        }
    }

    最后麻烦到你没法做,这个时候你就应该想到这是一道递推的题。下面附上正确代码。

    #include<stdio.h>
    int main()
    {
        __int64 a,i,n,s;
        scanf("%I64d",&n);
        for(i=0;i<n;i++)
        {
            int q=1;
            scanf("%I64d",&a);
            if(a==1)
            {
                printf("1
    ");
                continue;
            }
            if(a==0)
            {
                printf("0
    ");
                continue;
            }
            else
                if(a%2==0)
                {
                    while(a%2==0)
                    {
                        a=a/2;
                        q=2;
                        if(a==1)
                        {
                            printf("0
    ");
                            break;
                        }
                    }
                    if(a==1)
                        continue;
                    s=0;
                    while(a>0)
                    {
                        a=a/2;
                        if(a%2!=0)
                            ;
                        else
                            a=a+1;
                        s=s+1;
                        if(a==1)
                            break;
                    }
                    printf("%I64d
    ",s*q);
                }
                else
                {
                    s=0;
                    while(a>0)
                    {
                        a=a/2;
                        if(a%2!=0)
                            ;
                        else
                            a=a+1;
                        s=s+1;
                        if(a==1)
                            break;
                    }
                    printf("%I64d
    ",s);
                }
                
        }
    }

    在写出正确的代码的途中仍然遇到了很多困难比如,直接将数组开到10000009这么大,很明显int开出来的数组最大只能盛放下。‘汗’,不知道查不到,但是以后像这样中八位数的话就应该考虑一下了。还是去测试一下吧。。。测试完毕附上图

    #include<stdio.h>
    int a[111111111];
    int main()
    {
        a[111111110]=1;
        printf("%d",a[111111110]);
        return 0;
    }

    所占用的内存约为265m    很操蛋的一个数字,所以数组不能开得太大。要多学习算法知识。                         

  • 相关阅读:
    利用朴素贝叶斯算法进行分类-Java代码实现
    机器学习项目中常见的误区
    Chromium项目文化
    又一次定义CDN:为什么是迅雷?
    程序猿的思维修炼
    linux杂谈(十二):CDN加速
    Run-Time Check Failure #2
    打开excel2007&quot;向程序发送命令时出现故障&quot;
    [Unity 3D] Quaternion.LookRotation
    具体解释 IBM Bluemix 端到端开发体验
  • 原文地址:https://www.cnblogs.com/A-FM/p/5007587.html
Copyright © 2011-2022 走看看