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