训练第二天,收获

上课内容:

首先,讲了一下枚举法,着重讲了暴力枚举和分类枚举,暴力枚举像我这样的初学者用得比较多,而分类枚举这是用一定的算法思想来降低总时间复杂度;接着讲了用辗转相除法求最大公约数,在习题中还与递归结合起来使我印象很深;最后讲了一下记忆化思想简述,是指通过预处理将需重复利用的结果记忆起来,再次使用时直接调用,从而降低时间复杂度,这部分听的时候一知半解,做完习题看到会长评论才知道自己还是用的暴力求解,不过经过一次改正,印象倒是更深了;剩下来的时间全用在了刷题上,结果在同学的帮助下才勉强过了5题,希望接下来会有所提高吧。

个人感悟:

记忆化思想简述:

比如:给出一个数列{an},标号为1..n。接下来有m次询问,每次询问编号为x..y(1<=x<=y<=n)之间所有数的和。
如果用枚举法一个一个的求和,那么对每次询问都得运算x+y-1次,而且多次询问中很多求和是重复的,那么就可以先通过预处理将a1到an的和逐一求出并记忆下来,那么询问时直接调用即可,降低了总时间复杂度。
在后面求漂亮数时也可以用到。

for(i=1;i<=n;i++)//预处理逐一求和并记录
    {
        scanf("%d",&a[i]);
        sum[i]=sum[i-1]+a[i];
    }

求最大公倍数

虽说题目说结果符合范围,但是并不代表运算过程中不能不能超过,尤其是有数值较大的数相乘时要特别注意。要么可以通过强制类型转换为long long来运算,要么可以先除后乘来避免数值超范围。比如:

c=c/gcd(c,a)*a;
//或者:
long long d;
d=(long long)a*(long long)c;
c=(int)d/gcd(c,a);

三角形

尽量用循环控制输入多组数据代替使用多维数组;尽量不要对同一组数据多次使用,尽量在一个循环中使用,避免出错;在acm中,一次输入对应一次输出,没必要输入和输出分开。

    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        double a,b,c;
        scanf("%lf%lf%lf",&a,&b,&c);

        if(a+b>c&&a+c>b&&c+b>a)
            printf("YES\n");
        else
            printf("NO\n");

    }

而我之前为了达到多次输入最后一次输出,所以用了二维数组代替的a,b,c,导致程序很混乱,多次提交都错误。

空心三角形

如果要多次输入单个字符的话,最好是输入字符串取第一个字符。

char ch,a[10];
while(1){
    scanf("%s",a);
    ch=a[0];
}

fflush(stdin)虽然可以清除键盘缓存区,但是在acm竞赛中无法起到作用,所以基本不予考虑。

整数解

这题只想说要看清题目,那个yes和no居然只有首字母大写了,害我wrong了好多次,还有题目中正整数和正数要区分清楚等等,希望自己在每次做题前都能把题目读三遍。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值