第三周学习总结

博主分享初次参赛经历,反思了首次比赛的慌乱与方向迷失,强调找规律的重要性。学习了取整函数技巧,解析了四个贪心算法题目,涉及雷达覆盖、木棒排序、产品包装和成本优化。提到了编程策略和代码调试技巧。

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

感悟

这一周打了第一次codeforces的比赛,有很多体会。第一次打比赛有一点慌,前半个小时都平静不下来,最后平静下来以后又没有找准方向,A题就是个找规律的题,不是很难,但一开始只找到了行的规律对于列就像用循环来解决于是超时了,这个问题以后要改正,只要是能找到规律的问题就找规律,不要去投机取巧。由于这个问题以及知识不扎实的原因最后就只A了一道题。还有就是在vj上做题,总会没有思路,找不准方向,以及程序本身出现的逻辑问题,一天就只能AC一到二个题。但经过三个周的学习已经感觉到自己进步很多了,想问题的思路也有了很多改变,但这与其他人相比还很不足,还要继续努力。

小技巧

取整函数
头文件
ceil()它的作用是向上取整,得到>=参数的最少整数
例如:ceil(2)=2;ceil(2.5)=3;
floor()是向下取整函数,得到<=参数的最大整数
例如:floor(2)=2;floor(2.5)=2;
round()是四舍五入的函数
例如:round(1.3)=1;round(1.6)=2;
要注意当需要用到小数的时候要保证准度。
做题的时候要找准方向,想好思路以后再做题,不要一不会就去看题解,这样自己得不到很大的提高。
遇到程序不能达到自己想要的结果时,可以将程序停在可能会发生问题的代码段,然后输出解决这个问题。
一开始,可能不能意识到什么是主要问题,思路可能会很乱,但当意识到主要问题是什么,一定要把写好的代码重写,不然会更乱。

题目总结

贪心-C
题目描述:要求用最少的雷达覆盖全部的岛屿
思路:对于这个问题有两个解决方案。第一个从雷达方向,将小岛降序排列,使小岛在雷达覆盖范围边缘就能使所用雷达数量最少。第二个思路就比第一个思路更优了,可以将这个问题转为区间覆盖问题,以小岛为圆心,d为半径找到与x轴的区间,转化为区间元素问题。
主要代码:第二个思路

        for(int i=1;i<=n;i++)
      {cin>>x>>y;
      p[i].a=x-sqrt(d*d-y*y);
      p[i].b=x+sqrt(d*d-y*y);
      if(d<y)judge=1;
      }

    if(judge==1){cout<<"Case "<<k<<": "<<-1<<endl;continue;}
    a=p[1].b;ans=1;
    for(int i=2;i<=n;i++)
    {
        /*if(a>=p[i].a)continue;*/
        if(p[i].a>a){a=p[i].b;ans++;}
    }

贪心-H
题目描述: 机器加工木棒,如果加木棒比前一个长度与重量都打就不用再调试机器。
思路:注意,每次的比较都是与它前面加工的那个木棍比较。
第一个思想,将木棍按长度和重量分别升序,固定第一组的第一个在第二组中找到这个元素,然后判断后面的长度是否比前面的长度大,如果大就停止到大的,如果小继续,同时这个过程将这些元素归零。然后在主函数中用重量组对长度组重新赋值排序。结果证明这个想法是错的,。。。。反例 1 4 2 1 3 5 4 9 5 2 5 5
第二个思想,将木棍先按一个长度排,然后按重量局部排,(如果想要时间最少,每组木棍的第一个一定是综合排序最少的)加一个判断数组看这个木棍有没有加工,注意在循环中要注意要与之前加工的木棍比较,就是说要用一个新的数保存之前加工的那个木棍
主要代码:

bool cmp(Node x,Node y){
    if(x.l==y.l){
        return x.w<y.w;
    }
    else{
        return x.l<y.l;
    }
}

for(i=1;i<=n;i++)
         {if(visit[i]==0){
             visit[i]=1;
             judge=i;
          for(j=i+1;j<=n;j++)
            {
                if(w[j].l>=w[judge].l&&w[j].w>=w[judge].w&&visit[j]==0){visit[j]=1;judge=j;}

            }

贪心-M
题目描述:工厂生产的产品包装成高度为h 且尺寸为1 * 1、2 * 2、3 * 3、4 * 4、5 * 5、6 * 6的方形小包。 这些产品始终以与产品相同高度h且尺寸为6 * 6的方形包裹交付给客户。 工厂和客户的利益就是将从工厂向客户交付订购产品所需的包裹数量减至最少。要求您制作这样的程序。
思路:一开始看到这个题以为直接无脑相加最后相除就好,但感觉不应该这么简单,就想到了可能箱子的存放中货物的存放位置可能会影响这个题的答案,于是我用 1 1 1 1 1 1测试了一下,果然不对,于是这个问题的关键就转换成如何放2
2货物的问题,4-6规格的商品每个箱子中都只能放一个这种商品,且只有44中可以额外放22的箱子。思路就是先把4-6需要的箱子加起来,然后计算33的,这个有很多种放22情况,分别是0,5,3,1,然后总数加上33需要的箱子,计算时应该想到相除的特殊性,计算3-6的情况下能放多少个22的箱子。最后计算22的需要的箱子个数。然后我们只需要算出目前剩下的格子数来放11,用总的减去每种情况的即可。
主要代码:

int a2[4]={0,5,3,1};
 for(i=6;i>=4;i--)
    {
        sum+=p[i];
    }

    sum+=(p[3] + 3)/4;//3*3用的盒子数量
    a22=p[4]*5+a2[p[3]% 4];//能放2*2的个数

    if(p[2]>a22){sum+=(p[2]-a22+8)/9;}
    remain=sum*36-p[6]*36-p[5]*25-p[4]*16-p[3]*9-p[2]*4;
    if (p[1]>remain)
			sum+=(p[1]-remain+ 35) / 36;
    cout<<sum<<endl;

贪心-Y
题目描述:制造酸奶,每周可以生产和存储很多酸奶,但每周需要的成本不同,但生产多的酸奶需要更多金钱保存。
思路:因为当前周只能在它前面的周生产所需或在当前周生产,所以只需比较当前成本与前一周加保存费的成本看那个低。
主要代码:

ans=w[1].c*w[1].y;
    w[1].c+=s;
    for(i=2;i<=n;i++)
    {   a=min(w[i].c,w[i-1].c);
        ans+=a*w[i].y;
        w[i].c+=s;
    }

贪心-O
题目描述:给定一个具有N个整数A(1),A(2),…,A(N)的序列,您的任务是找出序列B(1),B(2),…,B(N ),这样
V =(| A(1)– B(1)| + | A(2)– B(2)| + … + | A(N)– B(N)|)+(| B(1) – B(2)| + | B(2)– B(3)| + … + | B(N-1)– B(N)|)
最小。
思路:这个题我用的是归纳法找规律,假如一组数据4 2 4 2,只要保证b[1]>=b[2],b[1]<=a[1],b[2]<=a[2],就能保证这个部分的式子值最小,然后就只需要考虑它后部分的式子,由前面的式子可以看出只要在那个区间中使b[2]与A[3]的值最小就能保证后面的式子最小。这个题真是贪心思想具体的体现了。
主要代码:

 for(int i=1;i<n;i++)
        {min1=99999;//重置很关键
            max1=max(a[i],a[i+1]);
         if(max1==a[i]){for(j=a[i+1];j<=b[i];j++)

                           {min1=min(abs(j-a[i+2]),min1);
                           if(min1==abs(j-a[i+2]))b[i+1]=j;

                            }

                        }

        else if(max1==a[i+1])
        {for(j=b[i];j<=a[i+1];j++)
               {min1=min(abs(j-a[i+2]),min1);
                   if(min1==abs(j-a[i+2]))b[i+1]=j;

               }


        }

以上。
加油。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值