全国新生赛——————————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\n");
            continue;
        }
        if(a==0)
        {
            printf("0\n");
            continue;
        }
        else
            if(a%2==0)
            {
                while(a%2==0)
                {
                    a=a/2;
                    q=2;
                    if(a==1)
                    {
                        printf("0\n");
                        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\n",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\n",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\n");
            continue;
        }
        if(a==0)
        {
            printf("0\n");
            continue;
        }
        else
            if(a%2==0)
            {
                while(a%2==0)
                {
                    a=a/2;
                    q=2;
                    if(a==1)
                    {
                        printf("0\n");
                        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\n",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\n",s);
            }

    }
}

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

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

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

时间: 2024-10-23 08:41:59

全国新生赛——————————1001————————————————的相关文章

比赛总结之————————————全国新生赛。

——————————————————————————————————————1002———————————————————————————— 投币洗衣机 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5878 Accepted Submission(s): 1460 Problem Description 如今大学生的生活条件越来越好了,近

SCNU 2015ACM新生赛决赛【F. Oyk闯机关】解题报告

题目大意:一个$N$$\times$$N$的阵列,每个格子有$X_{ij}$个调和之音,若每次只能选择走右边或下边,从左上角出发走到右下角,问最多能收集到多少个调和之音? 这题是一道很很很简单的DP题,但可能之前没接触过的同学需要一点脑能量去思考..如果用最蠢的办法,循环枚举每种选择,求出最大值的话,由于你总共需要往右走$N-1$次,往下走$N-1$次,路径总长度为$2N-2$,根据组合数学,总共有$C_{2N-2}^{N-1}$种走法,想想$C_{1998}^{999}$会是一个多么可怕的数字

记TJPUのACM新生赛——Stay young, stay simple

刚看完国家德比来写点什么吧...话说比赛挺无聊,光头也真是命硬. 2016-12-3,12:00-17:00,TJPUのACM新生赛如期举行. 总体来说这次比赛体验还是比我第一次进行5小时比赛的浙江理工大学新生邀请赛要舒服的多(那次浙理工OJ直接爆了...) 然后凭着运气好和各位大佬的不杀之恩混到了第一... 比赛情况大概是上面图片那样,其实写出的题都挺水的,后面的DFS.BFS以及贪心什么的我都没多想...反正不会写. 唯一值得记录的大概是D题,HDOJ上有(5979),是2016ACM/IC

ZSC新生赛 沼跃鱼早已看穿了一切

Description 沼跃鱼打开密码门后发现门后是一个像迷宫一样的房间,墙上的指示牌写着:房间内某处有一宝箱,但是宝箱被上锁了,钥匙在这个房间的某个角落.沼泽鱼对宝箱里有什么很感兴趣,但它必须先去拿到钥匙才可以打开宝箱.然而沼跃鱼早已看穿了一切,它看清了这个房间的布局,现在给出房间的布局图,问沼跃鱼拿到钥匙并打开宝箱最少需要走多少步.沼跃鱼每次只能向上.下.左.右中其中一个方向走一步,但若那个位置是墙时则不能往那个位置走(显然,沼跃鱼不能穿墙). Input 输入的第一行是一个整数T(0<T<

(最短路)17bupt新生赛——F. ch追妹

F. ch追妹 2017新生赛 时间限制 2000 ms 内存限制 65536 KB 题目描述 n个点的一张无向图,每条边长度为wi,ch站在a点,ch要追的妹子站在b点.ch可以使用一次膜法,将一条边的长度变为0.ch想知道他要追到妹子要走的最短路径. 输入格式 第一行为数据组数T(T≤10).每组数据的第一行为四个数 n,m,a,b(1≤a,b≤n≤10000,1≤m≤50000),分别表示点数,边数,ch的位置,妹子的位置.之后m行,每行为三个数 u,v,w(1≤u,v≤n;1≤w≤100

哈理工新生赛热身赛解题报告

本次热身赛6道题目,由于没有官方解题报告,自己写了一个山寨版的解题报告,希望对学弟学妹有所帮助 期中两到签到题该校OJ上没有挂出,我在田大神的帮助下a掉了其它四题,解题报告如下所示 线段 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 10(6 users) Total Accepted: 7(6 users) Rating:  Special Judge: No Description 坐标轴上有一些点,依次给出.点与点之间要求用

(dp)17bupt新生赛——B. Hmz 的女装

B. Hmz 的女装 2017新生赛 时间限制 1000 ms 内存限制 65536 KB 题目描述 Hmz为了女装,想给自己做一个长度为n的花环.现在有k种花可以选取,且花环上相邻花的种类不能相同.Hmz想知道,如果他要求第l朵花和第r朵花颜色相同,做花环的方案数是多少.这个答案可能会很大,你只要输出答案对109+7取模的结果即可. 输入格式 第一行三个整数n,m,k(1≤n≤100000,1≤m≤100000,1≤k≤100000)接下来m行,每行两个整数l,r,表示要求第l朵花和第r朵花颜

ZSC新生赛 聪明的员工

聪明的员工 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 481  Solved: 219[Submit][Status][Web Board] Description 小新是一家公司的员工,每个员工都有一个编号.每天上班时,老板都让员工排成一个队伍.但是,每次老板都对队伍的顺序不满意,于是老板重新编排新的队伍顺序,然后让员工按顺序排好.老板有特别要求,队伍每次只能将其中一个人移动到队头.聪明的小新很快想到最少移动次数使得队伍的顺序跟老板指定的顺序

广东工业大学2015新生赛round2(//自己脑洞堵了,madan!)

Path:新生赛 A.Number Sequence Description: A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. Given A, B, and n, you are to calculate the value of f(n). Analyse: 自动找周期法. CODE: int main() { int a,b,n;