ACM之近期学习总结

博主分享了近期在ACM学习中的体会,包括素数判断的优化、二分查找的应用、浮点数精度问题的解决以及对算法掌握的反思。强调要加强实战练习,提高代码实现能力和独立解题的习惯,避免依赖题解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近图论的题只做了两道,最短路径的算法的思想是明白的,但写代码时总会感到力不从心,可能做得不多,对代码比较生疏。接下来总结一下近期做题中学到的知识。

一.

一般判断素数一个个直接判断会超时,所以要用埃氏筛法并且打表

bool c[100000001];
void prime(int b) {
    memset(c, true, sizeof(c));
    c[1]=false;
    int n=sqrt(b);
    for (int i=2;i<=n;i++) {
        if (c[i]) {
            for (int j=2;j<=b/i;j++)
                c[i*j]=false;
        }
    }
}

判断回文数

bool ishws(int num) {
    int temp=num,ans=0;
    while (temp!=0) {
        ans=ans*10+temp%10;
        temp/=10;
    }
    if (ans==num)
        return true;
    else
        return false;
}

二.

今天做的二分的一道题

题意:现在的正确率是 a/b , 要达到c/d ,可以进行任意次的正确与非正确提交,求最小的提交次数能够得到c/d, 如果不能得到 s输出-1。

思路:

假设要进行p次正确提交,总共q次提交,q-p次非正确提交,  (a+p)/(b+q) = nc/nd , 其中  0<=p<=q  n>=1  且都是整数

所以 p = nc-a,    q = nd-b     p、q都是n的递增函数,所以题意要我们求出最小的q,因为a+p=nc,b+q=nd,所以q越小意味着n越小, 所以二分n寻找最小的n满足条件,无满足输出-1

代码:

 LL l = 1, r = 1e9;
 LL ans = -1;
 while(l<=r)
 {
      LL mid = (l+r)/2;
      LL p = mid*c-a, q = mid*d-b;
      if(p>=0 && q>=0 && p<=q)
      {
          r = mid-1;
          ans = q;
      }
      else
          l = mid+1;
  }
 cout << ans << endl;

从这道题可以看出二分的作用,以后还是要加强多做题,常话说熟能生巧,题目看多了做多了自然会形成一种条件反射。

三.

double精度有限,为了解决这个问题,我们可以设置一个eps=1e-8判断两个数是否完全接近

四.

总结:最近感觉前段学的算法学的时候很皮毛,不扎实,现在没有巩固都忘得差不多啦,而且最近做题也很少,要重新调整一下状态,cf上的很多题都很好,可以按由简到难得方式先做一些思维题提高代码的实现能力,很难的算法先放放,等自己足够熟练啦再统一训练。还有注意:1.提高自己的代码实现能力,不能眼高手低,总觉得大概是那个意思,都要自己亲手打一遍才能真正熟练。2.要养成自己独立做题的习惯,可能以前的老毛病 ,一遇到不会的题时,第一个想到的就是题解,看了人家的思路之后感叹“对,就是这样”,感觉人家的思路自己都会,但其实不然,一道题为什么会想到那个思路,这个问题的转化过程很重要,否则进步实在是太小啦,感觉自己也做了题,但其实都没有转化为自己能信手拈来的东西。好吧,主要就是这些问题啦,以后一定要改正。


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值