选择acm3周后的感悟
1.时间安排
选择了acm并不只是将时间全部投入到acm中去,现在的我明白了是将时间合理安排的更好,起初将时间全部投入到acm的学习中去导致我很多其他的学习课程没有跟上进度,使得需要学习的知识不断堆积,和acm的学习产生了冲突
计划:制定时间表,用最短的时间结束其他课程的学习,并安排零碎时间对其进行复习巩固
2.学习技巧和知识来源
学习acm课程之后,发现要想学好acm不能知识将知识进行积累,如果只是把知识学会了,是达不到老师要求的程度的,是达不到能与其他人对抗的程度的。思维与对题目中信息量的感知是更为重要的东西,当然,这一切都建立在有丰富算法知识的基础之上。
计划:腾出时间做cf上的题目,但多以看题解为主,ac题目为辅,经过一段时间的积累,估计才能达到过比赛题目10次的要求。做习题的时候,要先理顺题目的信息,找到关键点,先简化题目,再不断地向上附加条件。
3.第一次参加比赛的感悟
codeforces中的比赛有很多,其中的题目覆盖的知识量很广,由于近期练得都是贪心算法中的知识,所以当面对#710div3的第一道题目时,我本能的想到运用贪心算法中常用的技巧:数组储存数据和结构体储存数据,但是这并不是正确的思路
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
long long a[1000010][1000010];
long long b[1000010][1000010];
long long t;
cin>>t;
while(t--)
{
long long x;
int n,m;
cin>>n>>m>>x;
long long o1=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
a[i][j]=++o1;
b[j][i]=a[i][j];
}
}
long long o2=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
o2++;
if(b[i][j]==x)
{
printf("%I64d",o2);
cout<<endl;
}
}
}
}
return 0;
}
不仅数据创建的太大了,电脑运行起来甚至会有一定的卡顿,而且自己丝毫没有察觉到自己的错误,我感觉这是因为我做的贪心算法的题目太多了,导致我现在有一个固定的思想,就是先定义一个数组和结构体存储信息来做题(这样的思维方式对于做题的是很不好的,因为这样就等于限制了自己的思维,对于拥有多种方式可以解决的题目很不友好,丧失了很多扩展的机会)
下面是正确的代码,这样看的话其实大部分的题目是需要用到数学的知识来简化计算过程的,以后做题目一定要有限考虑数学方法。其实可以不用过多的着重于算法的体现。
学习算法的过程中,要深入研究算法,又不能被算法本身所束缚,从不同的题目中用算法的思维又不仅限于算法本身的使用
#include<cstdio>
typedef long long LL;
int main()
{
int _;
scanf("%d", &_);
while(_ --)
{
LL n, m, x;
scanf("%lld%lld%lld", &n, &m, &x);
x --;
printf("%lld\n", x % n * m + x / n + 1);
}
return 0;
}
正确的答案让我感到卑微,真的太简单了,这要是一道数学题目的话很快就完成了
4.短时间内的规划
短时间内将贪心算法再ac2道题拿到3/4的分数后,集中时间补上之前其他学科落下的东西。对应着codeforces上的题目从div3开始一遍遍的过题解。
我发现codeforces的下面有很多比赛,可以用来扩展自己的知识。
5.长期规划
投入时间研究算法,参加比赛,虽然可能拿不到奖,但是我只是提升自己就可以