0
点赞
收藏
分享

微信扫一扫

【本周所学总结(博客+习题+心得)】

上古神龙 2022-04-04 阅读 69
c++

一、本周博客:

 1.比赛中不想用动态数组,会相对麻烦些,于是int型数组最大能开到哪呢?

函数中的一维int型数组能开到5*e^5(即500 000),char型

全局二维数组能开到20000*20000(eg:a[20000][20000])。  详见      http://t.csdn.cn/8n6N2http://t.csdn.cn/8n6N2

2   写代码时遇到的问题,暂时不大理解 

   http://t.csdn.cn/h1rLU

http://t.csdn.cn/ZtZYF

3.超时,段错误,数组溢出,如何解决?

(1)访问了不该访问的内存会造成段错误,还是不理解,内部是个什么机制?

   http://t.csdn.cn/sft7F

有个解决方法说用new申请堆空间(比栈大);

4.函数如何返回多个返回值:(return 无法实现!)

http://t.csdn.cn/iQ7qh

(1)使用指针变量,通过地址传递方式完成(还可以用指针函数)

   (拓)(终于清晰了!)指针变量作形参,是将实参里的指针地址作为自己的内容,若给子函数里的指针赋值,取别的地址,就与原来的实参脱离了联系。  例题:      http://t.csdn.cn/RusWp

(2) 使用全局变量

int *pd()

{  static a[3]={4,5,6};

   return a;      }

int main()

{        int *p;

        p=*pd();//取a,即首地址

}

(3)使用数组作形参

5.(1)学习了散列,进一步接触hash函数,用函数值作数组下标,以空间换时间。

http://t.csdn.cn/B4ER0

(2)递归,重在两部分,递归边界,递归体

!递归的时间复杂度              

http://t.csdn.cn/thvqb

(3)与循环相比的区别:

http://t.csdn.cn/l0OR3

http://t.csdn.cn/UyDzY

由比赛题产生的问题,人家用递归不会超时,但是我用for循环写就是超时

http://t.csdn.cn/Tctb1

6.(struct)结构体变量作为函数参数调用的方法小结

http://t.csdn.cn/lndS6

7.搜索问题的应用案例

DFS    http://t.csdn.cn/D7JSi

BFS        http://t.csdn.cn/Eh6yl

8.字符串

(1)相关函数的总结 http://t.csdn.cn/1hojK        http://t.csdn.cn/jYR7b

字符数组不可以整体赋值,可以借助strcpy(),或者逐个赋值,但是string 类型的字符串可以整体赋值,二者直接相等,eg:string s1,s2;......;s1=s2;

9.进制转换

http://t.csdn.cn/rs2Qq

这篇涵盖代码写法http://t.csdn.cn/gbOsL

二、比赛题分析

1、

 【题目简言】一共两个数,不断用大的数减去小的数,统计次数

【思路】by递归统计次数

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
long long int sum=0;

void ty(int n,int m)
{
    if(n==0||m==0)
    {
        printf("%lld\n",sum);
        return;
    }                   //递归边界一般放首位
    sum++;
    if(n>=m)
    {
        n=n-m;
        ty(n,m);
    }
    else
    {
        m=m-n;
        ty(n,m);
    }
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        sum=0;
        long long int n,m;     //注意数据范围
        scanf("%lld%lld",&n,&m);
        if(n==0||m==0)
        {
            printf("0\n");     //注意本身输入有可能就为0;
        }
        else if(n>m)
        {
            sum=n/m;        //大范围上先算n中有几组m,及在n>m的前提下,需要减去几次m;在n,m相差比较大的时候能够缩短递归的次数;
            ty(n%m,m);
        }
        else if(n<m)
        {
            sum=m/n;
            ty(n,m%n);
        }
        else
        {
            printf("1\n");
        }
    }
}

自己的代码待讨论,为啥超时?

2.Codeforces 第 780 轮(第 3 部分)的B题

【题目简言】判断能否每次吃不同种类型的糖果(突破口:最大的两个数之差不能超过2)

【思路】找出最大与次大的两个数,如果差>2,不成立,反之成立。

#include<iostream>
using namespace std;
int pd(int m,int a[200000]);
int main()
{
   int i,t,m,s;
   cin>>t;
   for(i=0;i<t;i++)
   {
       cin>>m;
       int a[m];
       for(int j=0;j<m;j++)
       {
           cin>>a[j];
       }
       if(m==1&&a[0]>1)
        {cout<<"NO"<<endl;continue;}
        else if(m==1&&(a[0]==1)) {cout<<"YES"<<endl;continue;}
       s=pd(m,a);
       if((m>1)&&(s>=2))
        cout<<"NO"<<endl;
       else cout<<"Yes"<<endl;
   }
}
int pd(int m,int a[200000])
{
    int max1,max2,k=0;
    max1=a[0];
    for(int j=0;j<m;j++)
        {
            if(a[j]>max1)
            {max1=a[j];k=j;}
        }
        a[k]=0;
        max2=0;
        for(int j=0;j<m;j++)
        {
            if(a[j]>max2)
            {max2=a[j];k=j;}
        }
        return (max1-max2);
}

3.剩余的部分题目暂未破译,题目中存在的知识点正在学习中

三、心得感受

1.从哈工大的比赛就发现自己很明显的漏洞,题目有思路的,能写出来,但是,过不了,超时,段错误,溢出等等问题,郁闷死了呀,搜了博客怎么解决?说的有点笼统。看别人的题解,再琢磨。有些题,偏偏是那么做就对,用自己的方法不知道问题出在哪里了。感觉比赛一密集,发现问题的速度就比解决问题的要快了,自信在消逝。。。

2.比赛应该是用来检验这段时期的成果的,所以还是要学习更多的算法先,再想着比赛,分清主次。所以接下来重点攻克理论知识,以及造成超时的原因。学习是为了获得知识而学习,不是为了学习的状态而假装学习,常反思!

举报

相关推荐

【本周比赛心得】

本周总结

本周学习总结

本周小总结

本周项目总结

本周c++学习小结和心得

0 条评论