习题集链接:https://ac.nowcoder.com/acm/contest/19305

1028摸了

这个题解好就好在你看之前不会,看之后也不一定会,不影响正常做题
万一你看完就悟了呢

只提供思路和关键点,偶尔整活,想ctrl+c ctrl+v秒题的请出门右转

1001
嵌套循环,然后找规律
顺带一提没记住scanf和cin的返回值就来复习一下吧

while(~(scanf("%d",&n)))//成功(读到了)数据数量,不匹配0,失败EOF(-1)

~是按位取反

/*转:cin>>n返回的也是一个cin对象,当一个cin对象作为条件选择、循环等的控制表达式时,
编译器会将其转换为真值表达式*/
while(cin>>a)//成功(读完了)true,不匹配或失败false

1002
内层循环结束条件用i

printf("%4d",a++);

1003

printf("%c",'A'+j);

1004
同1001

1005
实际上是1004两倍空格还换了n,改改就能用

1006
判断%2也行,flag*=-1也行,随你

1007
tips:输出记得用&f(cout当我没说)

1008
显然我更喜欢插旗

for(i=1;i<=n;i++){

        a+=flag*(i*2-1);

        sum+=(double)1/a;

        flag*=-1;
    }

1009

a+=i;sum+=a;

1010
三个变量也行,数组也行,递归也行,随你

1011
这是数组

L[i]=L[i-1]+L[i-2]*2+L[i-3];//int L[1011]={0,1,1} 这是初值

1012
热知识:cin是有返回值的
真不会请出门右转1001

1013
1012

1014
1013
你愿意的话可以把n吃了

1015

if(!a && !b)break;

1016

while(~(ch=getchar()))

排除‘ ’‘\n’然后用计数器,上课讲过别的方法但是我忘了录播还没传

1017
写了个优化版,暂时想不到时间复杂度怎么继续压(虽然正常遍历怎么着都不会TLE就是)

int judge(int n){

    if(!(n%4)){

        return n+1;
    }

    for(int i=0,tmp=n;tmp;i++){

        if(tmp%10==4){

            return (int)(n/pow(10,i)+1)*pow(10,i);//跳过所有当前位是4的数
        }

        tmp/=10;
    }

    cout<<n<<endl;

    return n+1;
}

想必你已经知道主函数里有啥了

1018
还好是整型
左右移不动符号位,然后unsigned没有符号位,懂吧

while(n){

    cnt+=n&1;

    n>>=1;
}

1019
循环判断N&1,有就+=pow(k,i),i的初值是0,然后N右移

应该是这个思路,然而我在整活

    while(N){

        sum+=(N&1)*(a*=k);

        N>>=1;
    }

    cout<<sum/k;

1020
把上一题的代码改改用了
记得每次循环完重置那堆变量的值

1021
内层循环也要判断n,不太能一组一组加

        for(j=0;j<J&&i+j<n;j++){

            sum+=J;
        }

        J++;

1022
说明一下,收50只能找25,收100没有50就找3张25,每次找完判断25数量负没负
(100又不能拿来找记它数做啥)

        switch(a){

            case 25:
                c25++;
                break;

            case 50:
                c50++,c25--;
                break;

            case 100:
                if(c50>0){

                    c50--,c25--;

                }else{

                    c25-=3;
                }
        }

        if(c25<0)flag=0;

1023
读一个S和T加一个,不用数组

1024

        m=n%a?(n/a+1)*b:n/a*b;

题外话:我刚开始没看到题目里决定只买同一种包装的铅笔,写半天一测不对又调半天,裂开

1025
switchcase

1026
数组存储,大到小排序,然后循环

            if(L[i]<=i){

                break;
            }

至于怎么排见仁见智,我懒就用快排了,以前题解应该有

1027
题目说明的详细程度已经超过题解了。。
cnt记得重置

1028
待补充

1029
到sqrt(n)就可以不用判了,特判1

1030
因数个数奇Nancy,偶Johnson
然后这题就变成了分解质因数

    for(i=2;n>1;i++){

        if(!(n%i)){

            cnt++;
            n/=i;
            i--;
        }

    }

记得特判质数

1031
听说过三角形数吗

for(i=0;i*(i+1)/2<N;i++);

然后斜着看,奇数排右往左偶数左往右

1032
maxmin赋输入数据边界外的初值,懒得读题就用int边界(-2147438648 2147483647),读一个比一个

然而我条件反射qsort了,别学

    qsort(L,n,sizeof(long long),cmp);
    //没读题用longlong属于是
    printf("%lld",L[n-1]-L[0]);

1033
sum=0,读完除以n,然后同1032

1034
和为奇数就把最小的奇数丢了,循环里判min前加个条件就行

printf("%d",sum%2?sum-min:sum);

虽然没说明但是测试点里没有负数个糖果(倒不如说觉得这个要说明的我有问题)

1035
四个变量存呗,坑应该在不能一样大

用数组的记得去重
记得去重!

1036
mid是杆子正中,min是蚂蚁离mid最近的距离(fabs)

printf("%.0f",mid-min);

1037
两只蚂蚁相撞之前一只往左跑一只往右,在相撞点掉头,还是一只往左一只往右
等效于撞了没转向
理解了这个这题就变得很简单

a=flag?n-a:a;

备注:相撞指距离为0,转向不需要时间,我刚开始写没想明白这两点卡了好久

_ _ X> _ <X _ _        _ _ X> _ <X _ _
_ _ _ X> X< _ _L
_ _ _ X> X> _ _    R    _ _ _ (X> <X) _ _ _B
_ _ _ <X X> _ _L
_ _ _ <X _ X> _    R    _ _ <X _ X> _ _B /  _ _ _ (<X X>) _ _ _?
//钻牛角尖实录

1038

cnt=ch=='a'?cnt+1:cnt;

1039
被吃了

1040

cout<<(ch!='5'?ch:'*');

1041
跟3n+1猜想那题还是有点区别的,当然,只有一点

1042

cnt=h+30>=L[i]?cnt+1:cnt;

1043
月结余

rest+=300-a;

判断够不够

if(rest<0 && !flag)flag=-i-1;

存整百

save+=rest/100*100;

没了

1044
加一次比一次成了就break

1045
要考虑前半后半1415跨周期。。

但是我懒,用长度32的数组([30][31]放0,1考虑跨周期),直接遍历匹配输出下一个

            if(a==L[j] && b==L[j+1]){

                cout<<L[j+2]<<endl;
                break;
            }

1046
一个flag解决的题

上升,插旗;下降,有旗拔旗并计数,没有不管;

1047
不为负债就先买一次(记得统计空瓶瓶盖)再进循环,k<2 && g<4结束

1048
读数据之前用长1000的数组,过一遍三位数下标判断好数,是1否0

        for(i=l;i<=r;i++){

            cnt+=L[i];
        }

读一次判一遍应该也行不会TLE 吧

1049

if( blabla && blablabla && blablablabla)

1050
数组存每位的数

        for(k=0;k<j;k++,j--){

            if(m[k]!=m[j]){

                flag=0;
                break;

            }
        }

好像做复杂了

1051
前49题写累了来休息一下吧

1052
两层循环,i和j相当于坐标

printf("%.0f",fabs((double)i-2)+fabs((double)j-2));

1053
二维数组赋初值,有多少根自己数

cout<<L[0][a]<<' '<<L[1][a]<<endl;

用两个数组也行

1054
考虑系数1,-1,0(continue),首项不输出+号,最后两项x的格式
一堆if
看着写

1055
听说过辗转相除法吗

后记
累死了,零评那啥