ACM之路

ACM之路
2019年的寒假格外的长…120个题把萌新写的头皮发麻,整个寒假被c++和紫书安排的明明白白,写题经常会莫名奇妙的错好多好多好多次,很多次心态爆炸差点把笔记本锤了…但感觉确实收获了很多,学了DP,DFS,会了一些贪心,写了一点map,能走一点迷宫,和Farmer JOHN碰到了很多蛇皮问题,也被高精度的题整的明明白白…应该还是有点收获的吧,没事就看看论坛,看看大佬们怎么想问题,总是在质疑自己的脑子。可能这就是进步的过程吧,也是熬了很多个夜,退格了很多代码,和我两个好朋友一路鼓励,向他们学习,才了解的越来越多,每当学到新东西,就觉得自己越发的无知,但总想学点什么做点什么,也总想在很多年以后留下属于自己的东西。希望我还能坚持,希望不忘初心。
水题系列:
1.人见人爱A+B
题意:给出了小时分钟和秒,计算加法之后的时间
题解:循环判断进位,60进一次
2.人见人爱A-B
题意:算两个集合的差值
题解:从一个数组映射到另外一个数组,对数组进行排序,定义一个新的数组来进行标记,用循环将满足条件的输出
3.人见人爱A^B
题意:计算A^B的最后三位数
题解:循环保留最后的数字,和noj上一个类似,将保留的数字进行次方,避免超出数据范围,对于个位数要去掉前置的0,因为表示的是整数,而不是最后的三个数字
4.改革春风吹满地
题意:计算给出的N个点围成的面积
题解:首先计算结果是浮点数,保留一位小数,利用数学公式,s=((x2-x1)(y2+y1)+…+(x1-xn)(y1+yn))/2;
公式计算后取绝对值即可
5.今年暑假不AC
题意:给出了N个电视节目的播出和结束时间,问一天最多可以看几个
题解:贪心算法,将结束时间排序,用结构体,将开始时间在结束时间后并且结束时间降序的选出来,每选一个加一
6.三角形
题意:给定三条边,请你判断一下能不能组成一个三角形。
题解:两边之和大于第三边,注意换行就行
7.亲和数
题意:古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为:

1+2+4+5+10+11+20+22+44+55+110=284。

而284的所有真约数为1、2、4、71、 142,加起来恰好为220。人们对这样的数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。
题解:定义函数f,将给定的数字带入,计算他们的真约数之和,主函数中判断是否相同即可
8.超级楼梯
题意:给出楼梯的级数,一次智能走一级或者两级,求共有多少种走法
题解:多代两组数据算,斐波那契数列,按要求输出即可
9.不容易系列之二
题意:每过一个收费站就要扣一半的?,过N个收费站后数量已知,求有多少个?
题解:循环判断,乘二加一
10.密码
题意:不同类别的字符有四种,三种以上为安全的密码,求密码是否安全
题解:输入一个字符数组,有一类便把计数加一,判断最后计数的值
11.一只小蜜蜂
题意:蜜蜂从蜂房不同房间移动有几种方式
题解:斐波那契数列,但是要开long long(好像不开就WA了印象中)
12.不容易3
题意:N个方格涂三种颜色,有限制,求方法
题解:递推思想

a[0]=3,a[1]=6,a[2]=6;
    while(cin>>n)
    {
        t=n-1;
        for(i=3;i<50;i++)
            a[i]=a[i-1]+2*a[i-2];
        cout<<a[t]<<endl;
    }

每当增加一个方格,相当于对两侧新加一种情况

13.骨牌铺方格
题意:给出方格面积大小,计算有多少中铺满的方法
题解:递推,斐波那契数列(数组要开的稍微大一点,将数组开到50的时候WA了两次,开到52就AC了)

14.阿牛的EOF牛肉串
题意:三种字符排列,但不能其中一种相连
题解:还是递推思想

a[0]=3,a[1]=8;
    for(i=2;i<41;i++)
        a[i]=2*(a[i-1]+a[i-2]);
    while(cin>>n)
    {
        t=n-1;
        cout<<a[t]<<endl;
    }

每当增加一个新的,就会在之前的限制上产生新情况

15.神、上帝以及老天爷
题意:N个人将名字全弄混,求概率
题解:全错排公式

a[0]=0,a[1]=0,a[2]=1;
        for(i=3;i<21;i++)
    a[i]=(i-1)*(a[i-1]+a[i-2]);

16.不容易系列之(4)——考新郎
题意:N对夫妻中有M对找错了,求有多少种可能
题解:全错排公式乘以组合公式C,定义一个新函数来求组合数CMN,之
后相乘即可

17.折线分割平面
题意:N条折线最多把平面分成几部分
题解:套用中学学过的直线分割平面公式的推导,变式:2nn-n+1;
带入即可

18.Bitset
题意:10进制转化为2进制
题解:不断除以10,再求10的余即可,要定义一个比较大的数组,输出的时候从小到大反向输出(因为是除以10,所以实际上是先将个位数出来)

19.Picture
题意:输入两个数M,N,输出长为M宽为N的矩形
题解:循环输出字符即可,中间用空格填充(注意双循环应用不同变量,如I,J),注意换行,不然会WA

20.Switch Game
题意:N个灯,一堆操作后哪个还亮着
题解:从第一个灯开始,不断求余,看有多少种能除尽,之后判断奇偶即可

21.A==B?
题意:判断AB两个数是否相等
题解:一个很坑的题,因为会超出数据范围,所以要用字符数组,然后去除小数点后没有意义的后置0判断是否相等即可,将小数点前的逐个比较,后的反向储存在新的数组,去掉后置0比较

22.An easy problem
题意:给字母赋值,进行加减运算
题解:直接将ASCII值减一点即可

23.rectangles
题意:求两个三角形相交的矩形的值
题解:先排序,取中间两个计算出绝对值,如果中间的交不上,输出0

24.A+B again
题意:16进制的A+B
题解:直接在输出时

cout<<hex<<uppercase<<c<<endl;

即可(用 long long,没用好像WA了)

25.the sum problem
题意:给两个数,求某一段A-B满足和等于m
题解:相当于变式的等差数列求和的公式,枚举项数,把首相和末项代入,满足条件就输出(注意顺序,先输出小的,因为这个导致WA了好几次)

26.龟兔赛跑
题意:兔子匀速跑,乌龟有电动车,但要充电,问谁跑的快
题解:dp,因为兔子的跑步时间时固定的,只需要算乌龟的时间,能充则充,如果能撑到下一个电站则不充,对于每一个电站都要分析其情况,开一个dp数组储存

27 .snooker
题意:给N个球,根据斯诺克规则,能否达到预计分数
题解:根据球的多少直接带公式,大于7个则尽量一红一黑,否则递减计算即可

28 .treasure new start ,fresh man
题意:计算学分绩,有不及格的科目直接输出SORRY
题解:加权平均数计算,有小于60 的则直接跳出循环输出sorry,可以不用结构体(注意sorry的写法,注意大小写,这个十分坑)

29 .汉诺塔3
题意:汉诺塔
题解:依然是汉诺塔的递归思想,一旦满足了特定条件跳出即可

30 .小兔的棋盘
题意:不过中间的对角线,从左上角走到右下角有多少种方法
题解:类似于函数的递归或者也可以用C2NN的全排列公式,然后除以特定情况,这个感觉没问题,但还是WA了,最后还是用的递归算的

for(i=1;i<36;i++)
        for(j=1;j<=i;j++)
        x[i][j]=x[i-1][j]+x[i][j-1];		

31 .RPG的错排
题意:N个人,一半以上错排,求总共错排的个数
题解:用循环从一半的数开始进行错排,用错排公式,然后乘上CMN的排列公式即可

32 .Fibbonacci Number
题意:求斐波那契数列的第N项
题解:直接递推写出斐波那契数列的数组然后计算第N项即可
但数组要稍微大一点,要开long long,先打表,不然就WA了

33 .max num
题意:求给定长度数组中最大的数
题解;将第一个数取出来给MAX然后挨个比较和MAX的大小就行了,但这个是浮点数,最后要保留两位小数

34 .A|B
题意:判断A B能不能整除
题解:直接用%就可以了,开long long保险了一下

35 .夹角有多大
题意 :计算时针分针秒针的夹角
题解:表的一圈是360°,所以一个小时30°,以此类推就行了,把每一秒都代算出来,最后转化成角度制

36 .复习时间
题意:给出复习的效率和难度值,求如何复习
题解:直接复习最大的,这样得出的平方和复习效率也一定最大

37 .夹角有多大II
题意:平面上两个点求夹角
题解:直接用勾股定理先算出三角形的三边长度,然后用余弦定理算出余弦值,然后用cmath库中的acos再转化成角度制就行了

38 .手机短号
题意:给N个手机号码,求它的短号
题解:先输出6然后将数组从第6个开始输出即可,数组要数位开大一些

39 .简易版最短距离
题意:一条直线上求一个点到其它点距离的最小值
题解:双循环,把每一个点都算一边,把最小的值列出来就行了,注意循环的变量不能一样,每次进入内循环时都要把距离值S重新初始化为0

40.核反应堆
题意:有两种进行裂变的粒子,分别给出个数,求N秒后的个数
题解:递推,找出两种粒子的递推公式即可,然后数组打表。在输入的N值后带入,计算输入时间后的粒子数

通用题目系列:
1.3n+1 problem
题意:给一个范围M到N,从M开始,是奇数和偶数分别进行运算,求运算最多的次数
题解:将输入的两个数分别用别的数标记,保证即使交换大小重新排序后仍可以按大小顺序输出;然后循环计数,将最大的输出即可(类似NOJ一个,因为没注意大小顺序wa了好几次)

2.CANDY SHARING GAME
题意:N个小朋友拿了不同个数的糖分,每次把一半数量的给下一个人,奇数则老师再给一个,求最后每个小朋友的数量和分的次数
题解:循环计算,双循环,有奇数则加一,定义数组分,前一个为自己的一半和后一个一半的和即可

3.edge
题意:从一个点开始,输入V和A分别代表左转和右转,求出一系列操作中坐标的变化
题解:利用循环对方向进行标记,不同方向下一次转的方向也不同,多次方向要%4进行计算,注意余数为0的情况(wa了很多次,类似NOJ 的路痴那个,核心是利用循环标记)

4.不容易3
题意:N个方格涂三种颜色,有限制,求方法
题解:递推思想

a[0]=3,a[1]=6,a[2]=6;
    while(cin>>n)
    {
        t=n-1;
        for(i=3;i<50;i++)
            a[i]=a[i-1]+2*a[i-2];
        cout<<a[t]<<endl;
    }

每当增加一个方格,相当于对两侧新加一种情况

5.a+b
题意:用英文字母表示数字,计算100以内A+B的值
题解:字符串计算,先定义0-9的字符串数组,将字母的值与数字相对应,然后判断+前的长度和等号前的长度,带入到数组中进行值的比较

6.请使用SORT
题意:给了满意度和能选的元素个数,求满意度最大的值
题解:结构体排序,将满意度和元素输入,满意度降序排列(有点类似贪心),满意度相同时元素升序,求出满意度的总和,将输入的数给到另一个新的数组,再将K个元素输出(只能用K个元素),相当于贪心选取最大的

7.辗转相除法求最大公约数
题意:实际上是求N个数的最小公倍数
题解:先求前两个数的最小公倍数,然后再依次和后面求,最终求出来的就是最小的,最小公倍数可以相乘然后除以最大公约数

8.Ignatius and the Princess IV
题意:救公主的故事。。。给了N个数有一个数出现了n/2+1次,求这个数
题解:开始我想挨个计数,直到有一个数大于n/2,后来听了一下别人的思路,感觉十分有道理,有一个数大于n/2+1,那么第n/2+1一定是这个数!有点中位数的意思,一下子算法就简单了很多(自己想东西还是太死了,感觉很僵硬,想算法也很慢,还需要多做题)

9.next_permutation
题意:下一个全排列,求N个全排列中,第M个大的
题解:调用algorithm中的

next_permutation(a,a+n)

来计算全排列,定义一个数来计数,满足第M个则输出就行了

10.Delta-wave
题意:在一个三角形中,找出从M到N的最短路径
题解:开始一直以为是递推找规律,怎么也找不到,模拟感觉也很麻烦,直到在了解了XYZ的三向坐标公式

s=abs(as-bs)+fabs(a1-b1)+fabs(a2-b2);

然后带公式就行了

11.The Circumference of the Circle
题意:给了三个点的坐标,求圆的周长
题解:单纯的数学题,可以硬算找圆心,也可以直接带公式

a=sqrt(fabs(x1-x2)*fabs(x1-x2)+fabs(y1-y2)*fabs(y1-y2));
        b=sqrt(fabs(x2-x3)*fabs(x2-x3)+fabs(y2-y3)*fabs(y2-y3));
        c=sqrt(fabs(x1-x3)*fabs(x1-x3)+fabs(y1-y3)*fabs(y1-y3));
        p=(a+b+c)/2;

12.A==B?
题意:给两个数,判断这两个数是否相等
题解:看似是个很简单的问题,但因为有大数情况,所以即使开LONG LONG也不解决问题,要用字符数组来解决,挨个判断就行了,然后注意小数点的位置,和后置没用的0,去掉就可以AC了

13.Long Distance Racing
题意:给了上坡平路和下坡,求走完路的时间
题解:思路比较简单,分段算就行了,因为是来回,所以有上坡肯定有下坡,反之同理,所以上下坡的时间算一下,然后平路再算一下就行了

14.Specialized Four-Digit Numbers
题意:求十进制,十二进制,十六进制的各位和相同的数
题解:算一下十进制,十二进制和十六进制即可,然后枚举就行了

15.Bullseye
题意:打靶算分看谁赢
题解:算一下环对应的面积,然后把点的坐标带入比较就行了

16.Dirichlet’s Theorem on Arithmetic Progressions
题意:找出等差数列中的第n个素数
题解:先打表,欧拉筛,然后内循环判断等差数列的每一项,令一个计数器t,每有一个素数,加一即可

17.小女孩上楼梯
题意:给出小女孩上楼梯的情况,每次从1开始数数,问小女孩上了多少次,最多多少
题解:字符串找,每当有一个数是1并且该数右边大于1那么计数加一即可,最高层则可直接判断

18.delet from the left
题意:从左边开始删除字符判断多少个不同
题解:根据题意,先输入字符串,然后计算长度,令计数t等于长度,每当有同位置相等,则字符同时减一

19.枚举答案能不能做
题解:求一个数各个位之和的数,不断求和,直到是一位数
题解:首先这个数可能是大数,所以要开字符数组,然后利用ASCII求和,每当大于10的时候再继续循环。开始我想直接除以9做,后来意识到应该不断除以10余10,最后要注意是0的情况,很类似noj的一个水题

20.Joseph
题意:有n个人有好人有坏人,应该怎么排列使得杀掉的都是坏人
题解:开始想暴力循环找,被卡住了好久,然后听说了约瑟夫环,问题迎刃而解

int f(int n)
{
    int i,j,s,k;
    if(a[n]!=0) return a[n];
    for(i=n+1;;i++)
        {
            k=0,s=2*n;
            for(j=i;;j=j+(i-1))
            {
                if(j>s) {
            if(j%s!=0) j=j%s;
            else j=s;}
            if(j<=n) break;
            else s--;
            if(s==n) {
            k=1;
            break;}
            }
            if(k!=0)
            {
                a[n]=i;
                return a[n];}
    }
}

不断求余是关键,因为要判断杀人的位置,遍历数组,求余标记,当人数不满足时继续循环

21.a+b again
题意:给出两个字符串,计算相加的值
题解:其实就是一个十六进制加法的计算,hex转化一下就行了

22.Bitset
题意:十进制转化成二进制的数应该是多少
题解:当转化成二进制时,不断除以二余二就可以了,不过要用一个字符数组来储存,因为直接算出来的是倒序的,需要把顺序调过来

23.递推(折线分割平面)
题意:在一个平面上给出了n条折线,求折线折线把平面分成了几部分
题解:第一反应是切蛋糕那种问题,然后算直线分割,然后就只能递推一下了,f(n)=2nn-n+1

24.big number
题意:求n!的位数
题解:开始想开字符串,但发现十分麻烦,这时,高中学过一个公式n!位数=lg(1)+lg(2)+…+lg(n),传说中的斯特林公式,最后向上取整就可以了

25.stl的map(字符串中出现次数最多的)
题意:给了一堆字符串,问哪个出现的次数最多
题解:map.
这是第一次接触map,map是建立一个映射的关系,可以十分方便的表示数据类型的转变(我理解的还是很浅),用map开一个string到int的映射,将颜色放在first,数量放在second,遍历找最大
或者,用字符数组循环硬找也可以,亲测可以ac

26.归并排序求逆序对
题意:给了一堆DNA序列,求哪个逆序的次数多少的排序,输出
题解:没学过归并排序,完全懵了,于是就开结构体,做成了一个简单的结构体排序,中间用循环暴力找一下逆序的数量就可以了

27.Adjacent replacement
题意:给了一串数字,找规律输出
题解:很容易发现规律,是偶数不变,是奇数则减一,用数组输出就行了

28.fun number system
题意:给出了一个十进制的数和一个字符串,p,n分别代表正负,问能否组成一个二进制的数,使值和该十进制的数相当,没有就输出impossible
题解:因为是二进制,所以要先判断十进制数的奇偶,偶数则最后是0,奇数最后是1,然后将n除以2,同理继续判断,因为是不断求余得出的二进制,所以根据奇偶性也就是余数不断判断就可以了,但同样,这种二进制的题,一般都是倒序的,所以最后逆序输出就可以了

29.reduced ID numbers
题意:给了n个数,求对n个数的余数都不相同的数
题解:直接暴力枚举,如果数量为1,则直接输出1,不然从2开始枚举就可以了

30.points in segments
题意:给了m和n行数据,求去掉n行数据还有多少个数
题解:直接开一个数组标记一下就可以了,把给定的数据从1开始到m进行标记,处理n行数据,如果有相同的跳过输出就可以了

31.fatmouse
题意:给了老鼠食物的数量和换食物能换到的量和价格,求老鼠最多可以换到多少食物
题解:典型的贪心算法,很像之前做过的贪心背包最大价值的问题,需要利用结构体进行排序,求出单价,根据单价的高低,依次选就可以了

32.ignatius
题意:给了要交作业的截止时间和相应的分数,每次完成作业就会消耗一单位时间,问怎样做作业扣掉的分数最少
题解:贪心算法,但这里出现了时间,所以要优先根据时间来进行处理,因为时间是只能升序的,所以要根据时间降序进行处理,如果可以交则交作业,不然就往前推一天,同一天内根据分数大小进行排列,这样扣掉的是最少的

33.dota
题意:给了n个英雄的攻击力和HP,问怎样打损失最小
题解:还是类似的一个贪心,因为不能单单看攻击力,比如攻击低但可以持续输出,所以要将攻击和血量进行相除,根据“单价”来升序攻击

34.a+b problem II
题意:大数加法
题解:一看到大数就不能用传统的数据类型来进行处理了,这时要开字符串或者字符数组,将其进行遍历,然后根据ASCII值的变化和进位进行处理,同时要注意除以10,对10不断求余

35.数列贪心
题意:给出一个数列,求之前的和不大于后面二倍的最长长度
题解:直接暴力就可以了,初始化一个计数,然后如果满足条件则加一,否则就从一重新开始枚举,然后求最大值

36.prime friend
题意:给两个数,求将这两个数加上一个数,使他们为质数并且中间没有质数
题解:归根到底还是暴力解法,但这个要用一个bool数组和开long long,不然会过不了,然后要先打一个足够大的素数表(所以要用bool),欧拉筛就可以了,然后就暴力枚举两个数是否都为质数并且直接是否还有

37.supermarke
题意:给了超时卖东西的截止时间和利润,求怎样得出的利润值最大
题解:同理于做作业的哪个题,因为牵扯到了时间,时间是一个单向的,所以卖不了的往前推,然后卖最贵的就可以了

38.number sepuence
题意:给了一个数列1121231234…求第n个数是什么
题解:要先建立起这个的递推关系,要用斯特林公式求一下位数,但因为每一个位置只能放一个数,所以要进行处理一下,也就是将两个数或者高尾数不断求%10和/10就可以了

39.火车看路灯
题意:给了火车的长度和成等差数列的路灯的线性位置,求能看到多少个路灯,不被遮挡就可以看到
题解:典型的等差数列的计算,一个简单的数学题,运用等差的公式和性质,注意一下边界值的处理和火车和路灯重合在一个点的情况就可以了

40.map字典查找
题意:给出了单词和其对应的单词,求输入的单词对应的是什么
题解:简单读题可以发现是一个典型的映射问题,建立一个

map<string,string>a

然后输入字符串,利用字符串的find和end分别判断是否找到和是否结束就可以了

41.詹姆斯邦德的跳跃
题意:给出高度,体重,绳子的弹性系数等,如果落地速度大于10则会被摔死,否则逃生,判断是否可以逃生
题解:一个简单的物理题,利用动能定理,计算落地的速度,弹性势能算绳子长度判断是否可以落地即可以了

mgh=1/2*m*v*v,W=1.2*k*l*l;

42.数字三角形
题意:给出一个由数字组成的三角形,每次从相邻的两个里挑一个大的,问最大值是多少
题解:在紫书也出现过,一个典型的dp问题,分析一下,写方程就可以了

dp[i][j]=dp[i][j]+max(dp[i+1][j],dp[i+1][j+1])+a[i][j];

43.01背包装珠宝
题意:给出背包的大小,珠宝的重量和价值没在装最多珠宝的前提下,总价值最大
题解:开始以为是贪心,然后发现是一个简单的dp问题,因为要保证装的数量要最大,不能光利用单价进行结构体排序,建立dp方程就可以了

44.青蛙聚会
题意:给出一条线上青蛙的位置,跳跃的距离,线长度,求能否跳到相遇
题解:开始想像noj那个一样直接暴力算一下,结果wa了好多次,然后就根据提示,看了紫书的拓展欧几里得定理,解二元的线性方程,然后带入排除一下就可以了

45.房子关灯
题意:给出房子的开关灯情况0,1,如果0,1,0则中间的人会被打扰,问最少关几个灯使所有人不被打扰
题解:直接模拟一下就可以了,找到第一个0,1,0开始,然后每次只需要关掉右边的灯(因为向右遍历,这样最少),然后计数加1就可以了

46.最长公共子序列
题意:给了两个字符串,求其最长的公共子序列(不连续)
题解:开始想着暴力找一下,大概可以实现,但实在是有点麻烦,然后哦发现这还是一个dp问题,如果同位置的相同就取找下一个,不然则挑一个长的继续找

dp[i][j]=dp[i][j]+max(dp[i+1][j],dp[i+1][j+1])+a[i][j];

47.素数表
题意:给两个数,这一个数是两个质数的乘积,如果两个质数都小于第二个数,就good,否则bad输出那个数
题解:思路很简单,暴力一下就可以了,但这个要先打表,调用函数很容易就超时了,然后因为是大数,所以应用同余定理求一下这个大数和质数的余数,如果可以整除,则判断和第二个数的大小就可以了

48.机器生产
题意:给出机器和任务的难度和时间,求机器做最多任务的利润
题解:首先这还是一个贪心算法,贪心的思想,先要利用结构体进行排序,如果时间相同则难度降序,否则时间降序,然后判断机器的时间是否大于任务的时间,大于则计数的数组加一,最后根据计数的数组算利润就可以了

49.大数幂乘
题意:大数幂乘
题解:直接套大数幂乘的板子就可以了,弹药注意处理小数点,因为是高精度,所以小数点后的位数和后置0要注意

50.火车站
题意:给出了一堆火车的进站顺序,问火车应该进站还是出,结束为finish
题解:本质上就是一个进出栈的问题,将进站的和应出站的进行比对,对上了则出站,然后到下一个车,对不上了则是no,如果车站空了也是合理的可以继续,开一个数组标记一下就可以了

51.字符出现次数
题意:统计哪个字符出现的次数最多,输出最多的次数
题解:直接暴力找就可以了,如果连着两个相连相等则加一,否则则循环i加一,然后计数归1就可以了,开数组储存

52.robot motion
题意:给了一堆的指令,问机器人怎么走出去
题解:开始想着模拟一下,然后发现模拟十分麻烦,果断的进行搜索,直接深搜就可以了,WESN分别是不同方向,用字符串处理就可以了

53二分农民花费
题意:给了农民n个月的花费,分了m组,求组的最大值的最小可能
题解:最小化最大值问题,采用二分法就可以了,0和单月最大值分别为left,right,然后对于分出的组进行比,小于和大于m分别向左右逼近就可以了

54.JOHN存钱
题意:给了JOHN的钱和各种存钱的情况,求出怎样存的收入最大
题解:dp一下就可以了

for(j=0;j<shu;j++)
                for(k=a[j].money;k<=chu/1000;k++)
                    dp[k]=max(dp[k],dp[k-a[j].money]+a[j].get);
            chu=chu+dp[chu/1000];

这是一个类完全背包的问题,dp也可以求解

55.滑雪记忆化搜索
题意:给了一个滑雪迷宫,每次只能走比较低的地方,求最多能滑多远
题解:典型的记忆化搜索问题,开一标记数组和dp一下就可以了,因为要取低的,所以进行dp判断当前大小和下一个位置的深搜哪个值更大,深搜一直搜到边界就可以了

56.Technicians
题意:求围城的最大周长
题解:还是一个典型的dfs,直接对于一个位置八个方向只要可以继续则继续搜,一直搜到没有或者到达边界,然后每有一个块则长度加4,每有一个相连则减一

57.油田
题意:求相连的八连块有多少个
题解:深搜一下就可以了,依然要搜到边界(感觉迷宫类的问题用DFS都差不多),然后没找到一个计数量加一,用双重循坏找到当前相邻的八个格子就可以了

58.搜索素数环
题意:求把给定的数排列都到相邻的和为素数
题解:DFS就可以了,判断各种可能的组合情况,然后打一个素数表,将组成的和和素数表进行比对,如果是素数则继续,不是则再次排列

59.搜索迷宫走多少格子
题意:找这个迷宫可以有多少格子可以走
题解:直接暴力搜索就可以了,找到一个能够走的最长路径,调用dfs函数进行比较就可以了,依然是搜索到边界或者没有格子可以继续走了就跳出搜索,从一个开始的点找就可以了

60.迷宫摆棋子
题意:给一个棋盘,求最多可以放下多少个棋子
题解:暴力搜索就可以了,要开一个数组对棋盘进行标记,放一个棋子或者搜索过一次就要标记一下,要用回溯法

for(i=0;i<n;i++)
        if(qizi[c][i]=='#'&&dp[i]==0)
        {
        dp[i]=1,t++;
        dfs(c+1);
        t--,dp[i]=0;
        }
    }

61.求迷宫的最短路径
题意:给出一个迷宫,求走出迷宫的最短路径,要求挨个输出坐标
题解:开始一直想深搜一下,发现这个是个广搜的模板题,但最后还是用深搜做了,同理迷宫类问题找最长的就行了,直接DFS一下,然后max保存就可以了

62.相同字符前缀
题意:给了一堆单词,求相同前缀的有多少
题解:建立一个简单的以为MAP就可以了,然后利用substr截取字符串的每一个长度,存放到映射中,然后输入字符串,然后对比每一个长度和字符串相同的前缀

63.摆花
题意:给了n个花盆和美观度,怎样摆最大
题解:因为每种花只能有固定的位置,所以对于不同的花就要dp一下,判断i+1对应的该位置和之前的哪个更大就可以了

dp[i][j]=max(dp[i-1][j-1]+flower[i][j],dp[i][j-1]);

64.构造递减数列
题意:给了n/2个数,求将他们拆分成n个数的递减数列
题解:这是一个贪心问题,只需要将第一个数拆成0+本身,然后下一个数和前一个数的右侧进行相比,取一个比较小的选,然后左侧的数是本身减掉右侧就可以了

65.切生日蛋糕
题意:n+1个人分蛋糕,求分出的一个蛋糕可以分的最大数
题解:还是一个二分问题,二分的左右分别是0和蛋糕的最大值,然后左右逼近一下看能分多少份出来,如果分出来的大于n+1和小于n+1则左右再次逼近就可以了

66.二分烘干衣服
题意:给了衣服的带水量和烘干机烘干量,问怎么洋时间最少
题解:对于带水量小于烘干机的可以直接风干,大于的则需要解一个方程,即时间是由风干时间和烘干机时间共同组成的

if(a[i]>t) h=h+(a[i]-t+hong-2)/(hong-1);
                if(h>t) s=0;
            else s=1;
                if(s==0) left=t;
            else right=t;

67.优先队列拿石头过河
题意:有一堆石头,怎么拿掉可以是相邻石头的最大值最小
题解:最小化最大值问题,还是要二分思想,这个要先升序排序一下,然后不断取石头,根据大小左右逼近就可以了(果然二分类都是套路,正确找到上下界,问题就解决了一半)

68.走01迷宫
题意:求出走01迷宫的路径
题解:可以直接DFS,这个要用回溯(回溯好难)

if(x1>=0&&x1<5&&y1>=0&&y1<5&&migong[x1][y1]==0&&dp[x1][y1]==0)
        {
            dp[x1][y1]=1;
            a[t+1].x=x1;
            a[t+1].y=y1;
            dfs(x1,y1,t+1);
            if(s!=0) return;
            dp[x1][y1]=0;
        }

在边界范围内则直接搜就可以了

69.fun number system
题意:给出了一个十进制的数和一个字符串,p,n分别代表正负,问能否组成一个二进制的数,(正负有区别)使值和该十进制的数相当,没有就输出impossible
题解:因为是二进制,所以要先判断十进制数的奇偶,偶数则最后是0,奇数最后是1,然后将n除以2,(这个要利用十进制转化成二进制的本质了,就是不断的除以2再对2取余数,一直算到最后)同理继续判断,因为是不断求余得出的二进制,所以根据奇偶性也就是余数不断判断就可以了,但同样,这种二进制的题,一般都是倒序的,所以最后逆序输出就可以了

70.优先队列输出任务号
题意:给了任务的序号时间间隔等,求完成任务的序列
题解:这个要用优先队列了,n个任务内,每输入一个就要顶出来一个

while(1)
    {
        if(i==n) break;
        cout<<pq.top().id<<endl;
        i++;
        a=pq.top();
        pq.pop();
        a.time=a.time+a.c;
        pq.push(a);
    }

顶部的时间要不断叠加

71.优先队列,拿石头
题意:有一堆石头,奇数扔,偶数不扔,问最远的石头有多远
题解:基础的优先队列的操作,但中间要注意处理不同的奇偶数,给出了石头的坐标,和能扔到的距离,然后输入弹出顶部就可以了

72.优先队列演讲算平均分
题意:给了比赛的分数,要求计算去除后的平均分
题解:因为要去掉2*m个,所以如果开数组就会超时了,所以用一手优先队列,开两个队列,一个升序一个降序,然后每次队列中的元素大于给定的值就弹出

73.卡特兰数
题意:要求输出卡特兰数的第n个
题解:直接打表就可以了(然后我开了字符串数组,把结果存进去调用就可以了)

74.水果店二维map
题意:给了水果的名字产地数量,求排布
题解:开一个二维map就可以了,但是要用到迭代器,以前写一维的时候不用也可以写,但二维的话要用了

 for(c=m.begin();c!=m.end();c++)
        {
            cout<<c->first<<endl;
            for(d=c->second.begin();d!=c->second.end();d++)
                cout<<"   |----"<<d->first<<"("<<d->second<<")"<<endl;
        }

75.火星文字
题意:给了火星的文字,求对应的地球文字
题解:就是一个普通的map,开一个

map<string,string>a

就可以了,输入的时候直接把字符串输入进去就行了,但要开一个空的字符串用来比较,如果不是空字符串则加一,否则输入给定的字符数组,中间要用getchar()

76.枚举答案能不能做
题解:求一个大数各个位之和的数,不断求和,直到是一位数
题解:首先这个数可能是大数,所以要开字符数组,然后利用ASCII求和,每当大于10的时候再继续循环。开始我想直接除以9做,后来意识到应该不断除以10余10,最后要注意是0的情况,很类似noj的一个水题,但这个要循坏的更麻烦一些,中间要对字符进行处理

77.方格涂色游戏
题意:给12或者21方格进行涂色,如果涂满则消除一行的问怎样涂可以都可以放下
题解:分析一下可以发现这是一个找规律的题,奇数和偶数的方格涂色情况不同,可以从1-1,1-3,4-3,4-1,等地方开始涂,这样每两个会消除一次,始终都可以放下

78.求序列的逆序对
题意:给一个数组,每次把第一个放到最后,求怎样的逆序对数量最少
题解:开始想直接暴力解,然后三循坏实现后发现复杂度太高了,会超时,这个应该递推一下找规律

 t=t+m-2*a[i];

79.二分截取木棍
题意:求可以被截取的木棍的最长是多少
异界:题目类似分蛋糕的那个二分,所以还是左右分别为0和木棍最大值,然后分组后开能分多少组,最后要高精度处理(直接floor会wa掉,这个要先*100再/100)

80.dp钉子和小球
题意:给了钉子和小球排列的三角形,问小球下落的概率
题解:这个本质还是一个dp问题,但因为是算分数,要先用辗转相除法求最大的公约数,然后要让上面的数据尽量大一些,这样可以避免小数的计算,因为要么钉子要么没有,所以点上的概率都是1/2,用

(dp[i+1][j]+dp[i+1][j+])/2

就变成了一个简单的数学概率模型了

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值