丝雨学姐小灶班——Week 2

  1. P1085 不高兴的津津

这题让我发现了一个神奇的东西——break。原来还有跳出循环这种操作的2333。
这题大体上还是好理解的,正好试着把 Week 1 里自己瞎捣鼓的数组用了一下(后来发现就是多此一举),就是后期那个输出哪天最不高兴困扰到我了。(真是菜得抠脚╮(╯▽╰)╭)
试了几次不成功,感觉是自己思维上局限了,于是心怀愧疚地打开了题解,发现了这一段代码:

#include "stdio.h"
int main()
{
    int a, b, c[7],i,max=0,counter=0;
    for (i = 0; i < 7; i++)
    {
        scanf("%d %d", &a, &b);
        c[i] = a + b;   //每天上课时间
        if (c[i] > 8)   //判断是否开心
            counter++;
        if (c[i] > max) //寻找最大值
            max = c[i];
    }
    if (counter == 0)   //开心的情况
        printf("%d\n", 0);
    else               //不开心的情况
    {
        for (i = 0; i < 7; i++)  //接下来遍历这个数组
        {
            if (c[i] == max)
            {
                printf("%d\n", i + 1);
                            //输出第一个出现最大值的日期
                break;
            }
        }
    }
    return 0;
}

没毛病,原来是先找最大值再找第一次出现最大值的地方。break好评,新手完全能明白意思,感动。
于是也拿小本本记下来,找最大值并且找到第一次出现最大值的地方是可以这样操作的。

  1. P1046 陶陶摘苹果

看到题面的时候我是激动的——“妈耶,总算有道题来送温暖了!”熟练地胡乱搞一个数组往后操作,读入,判断,输出,把样例输进去一试也完全没毛病,暗喜一个AC就这么被我二十分钟拿到手了。(暴露了凄凉的做题速度)结果贴到洛谷上一看,我去,就过了4、7、9三个点(此处明显伏笔)。调试一下竟然发现,乖乖,原来数组定义到[10],只能放9个数的呀 /笑哭
懵逼中
这就是菜鸡不按套路好好看书就强行起飞做题的后果吗? /托腮
好吧我意识到了问题所在,于是把数组定义到了[11],嗯~~~~,爽!
这时,令人窒息的事情发生了——花式WA
发生了什么?换了几个测试点给我花式WA吗??? /黑人问号脸
☀好吧因为是边做题边写心得的所以自己发抽的过程已经完整展现在上面了。/托腮 没错我改数组定义到[11]的时候把下面读入第十个苹果高度的[10]也改成[11]了哈哈哈哈哈哈哈哈哈哈【MMP】

  1. P1059 明明的随机数

没学过啥排序啊,脑子不够使,但是感觉这个还是挺重要的,于是就翻题解给自己剧透啦~
(1)桶排序
先上个代码

#include<stdio.h>
int n,t[1001],i,ans;
int main(){
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&ans);//此时ans没用显然,懒得在定义一个变量,直接用。
        t[ans]=1;
    }
    ans=0;//此时ans要归零。
    for(i=1;i<=1000;i++)
        if(t[i])
            ans++;
    printf("%d\n",ans);
    for(i=1;i<=1000;i++)
        if(t[i])
            printf("%d ",i);
    return 0;
}

这个C++有些语法看不懂也放着比对用

#include<iostream>
using namespace std;
int main(){
    int n,x;
    cin>>n;
    int sum(0),bus[1002]={0};
    for(int i=1;i<=n;i++){
        cin>>x;
        if(bus[x])  //如果这个数已经出现过了,那么跳过
            continue;
        bus[x]++;  //如果没有出现,把数据放在桶里,并让总数居++
        sum++;
    }
    cout<<sum<<endl;
    for(int i=1;i<=1000;i++)
        if(bus[i])
            cout<<i<<' ';
    cout<<endl;
    return 0;
}

好了搬完代码我开始学习这个高端技巧了
很好,C++的那个果然没看懂,但是貌似并不是语法不懂,反正pass
第一个C的基本懂了,虽然bool还是很迷。原来这就是桶排序吗 /笑哭
还有,要留心这里下表与元素值的妙用噢!
(2)另一种方法?

#include<iostream>//就是C++的基本库
#include<cstdio>//这个不打NOIp会爆0
using namespace std;
int main()
{
    freopen("random.cpp","r",stdin);//freopen,洛谷不要,but NOIp要!
    freopen("random.cpp","w",stdout);//freopen,洛谷不要,but NOIp要!
    int n,a[1001]={0},res=0,t;
    cin>>n;//C可以用scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        cin>>t;//C可以用scanf("%d",&t);
        if(a[t]==0)    //本人注:表示未按下面的方式赋过值,读入的是一个新数
        {
            a[t]=t;
            res++;
        }
    }
    cout<<res<<endl;//C可以用printf("%d\n",res);
    for(int i=0;i<1001;i++)
    {
        if(a[i]!=0)
        {
            cout<<a[i]<<" ";//C可以用printf("%d ",a[i]);
        }
    }
    return 0;//完美结束!!!
}

这位解题人有心了啊,照顾了我这个不懂C++语句的人(虽然看着看着现在差不多也知道每句是在干啥了)
仔细一读,发现——这和上面的桶排序是一回事吧!
数组初始化清零的方法划重点!!!a[1001]={0}
还有,【相等是==】!!! if (a[m]==0) {
还有还有,我读取数组数据的时候,由于输入的最后一个数据是不带空格的,我以为之前的每个输入都要带空格,然后最后一个特殊处理,结果发现前面那些输入的时候直接不带空格都OK的(嘿嘿被幼儿园小盆友虐爆了)
Anyway,这题被我搞定啦~

  1. P1089 津津的储蓄计划

原谅我想挑个软柿子捏的想法。看到这题AC的人相对比较多,虽然是在倒数第二题,但还是被我拿来先做啦~
第一眼看去就是小学应用题的感觉呢!
好吧我已经AC了,这题就是要注意细节,很多很多细节!
写一写我因为不仔细掉进去的坑吧:
(1)我用了两个数组,这两个数组间的下标的对应一定要小心!有些是 i 对应 i+1,有些又是 i 对应 i ,千万慎重慎重!
(2)存款 d 是累加的,要+= (智障的我这个都会错)
(3)看题面最后,【津津手中会有多少钱】,MMP要加上最后一个月剩下的钱的呀!!!
还有一个不是坑的,我想判断 b[2] 到 b[13] 是不是都是非负的,if 是就balabala,这个正常应该怎么实现呢?希望以后我会开窍吧

  1. P1181 数列分段Section I

昨天沉迷高数没有写代码呢,打开洛谷突然发现自己竟然漏过了一个水题。All right,十分钟搞定它!emmm,输出的时候注意是 k+1 就行了,其他没毛病。

  1. P1482 Cantor表(升级版)

看起来超级简单嘞,不就是分子乘分子,分母乘分母,最后约分嘛!
但是代码一写咋就AC不了了呢?一开始只过了一个点,后来换了个 long long int 过了仨,emmm,很迷。
好吧其实我隐瞒了一个重要的事实:我根本不会约分啊!我的土方法就是从 i=2 到 max(分子,分母),分子分母同时能整除 i 我就把 i 约掉。好吧现在大半夜的神志不清我也寻思不出问题出在哪儿了。
翻翻题解,原来【最大公约数的正确求法】是辗转相除法or更相减损法
1.辗转相除法

int gcd(int a,int b){//辗转相除法求最大公约数
    if (!b)return a;//如果b==0,a是最大公约数
    else return gcd(b,a%b);//不然继续
}

2.更相减损法

    while(c!=d)
    {
        if(c>d)
            c-=d;
        else
            d-=c;
    }

    int ww=d;//此时ww为最大公因数
    a/=ww;b/=ww;

好吧,拿小本本记下来。

  1. P1047 校门外的树

再次发现水题hhh
诡异
但是第一个点不过是几个意思???
好吧,问题应该是出在最后计数输出的时候要从 i=0 开始数……
emmm,为啥捏? /疑惑

    int a[10001]={0};
    for (i=1;i<=m;i++) {
        scanf("%d %d",&x,&y);
        for (k=x;k<=y;k++) {
            a[k]=1;
        }
    }
    k=0;
    for (i=0;i<=l;i++) {
        if (a[i]==0) k++;
    }
    printf("%d",k);
  1. P1420 最长连号

感觉是水题,就是第一遍想的时候在怎么找到【最长】这个点卡住了,但是仔细想一想也能找到方法。AC以后翻一下题解,感觉下面这段代码跟我思路接近,贴一下:

#include<iostream>
using namespace std;
int main()
{
    int n,ans=0,temp,b,max=1;               //ans:答案;temp:现在这个数;b:前一个数;max:这个序列的最大长度
    cin>>n;
    cin>>b;                //输入,初始化b 
    for(int i=1;i<=n-1;i++)
    {
        cin>>temp;
        if(temp==b+1) max++;    //如果这个数是前一个数加1,最大值就增大1 
        else max=1;             //否则max回到初始值 
        if(ans<max) ans=max;    //如果最大值比当前的答案大,更改答案 
        b=temp;                 //b=当前这个数 
    }
    cout<<ans;                      //输出 
return 0;
}
  1. P1888 三角函数

为啥水题一来就是排好了队一大串呢 /笑哭
前头划水最后疯狂赶ddl的我看到了胜利的曙光~
都讲了是勾股数嘛,所以主要问题就是在约分上面吧。但是呢,约分这个点在前两天我做的 Cantor表 这个题里已经解决了嘛,开森!
顺便再贴一段辗转相除法的直白版代码:

int gcd(int a,int b)       //定义函数gcd 计算 (注:在最开头,主函数中直接调用即可;显然这里要求a>b)
{
	if(a%b==0)  
        return b;          // 如果a能整除b 则b为最大公约数 
    else                   
        return gcd(b,a%b); //如果不能整除,则将b作为新的被除数,a作为新的除数,    
} 

还有啊,为啥同样是从小到大排序,我这个画风比人家的low辣么多呢??? /笑哭
在这里插入图片描述
在这里插入图片描述
嗯嗯,数据区间1~10^9,所以 long long int (还是 long int 就够了呢?)
到这里ddl应该算是赶完了吧,我得转战NOJ了,咱软协的张舵部长要求新手国庆期间去自学语言,收假前刷上个三五十题 /笑哭/笑哭/笑哭

**

以下是我做NOJ时学习到的知识

**

  1. 保留小数位数
    double a,b,c;
    scanf("%lf %lf %lf",&a,&b,&c);
    printf("%.3f\n%.6f",a+b+c,(a+b+c)/3);

定义双精度浮点数;读入双精度浮点数;保留三位小数

——————————— 下接 Week 3 ———————————

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值