第八周总结——解题总结

6 篇文章 0 订阅

        自从4月初收到搜索专题题目到昨天,九十多道题目的所有题干都读了一遍,根据自己的理解总结了题意,题目的代码有时一天一题,有时两三天一题,当然也有效率更高的时候。当我写了一些题目的代码时,我会找一天统一提交找错(工程量很大)。当然,在做题时会发现自己不止搜索,其它一些地方比如bool函数、逻辑、数组等比较简单的问题也会出错,并且遇到有关字符或字符串的问题会产生抵触心理,这急需解决。
        之前一直在学习理论知识,包括代码模板,等到真正自己上手并结合实际时,在输出条件约束、搜索条件、标记回溯的设定上面还会根据题意纠结很久修改多次,但会在后面熟练一些。下面选择了5道题,来总结一下解题过程:

1、选数:[NOIP2002 普及组] 选数 - 洛谷

题意:n中k个整数相加且合均为素数的种类数

这是我最初的素数判断代码部分:

bool isPrime(int h)
{
 int isPrime;
 for(int i=2;i<=sqrt(h);i++){
  if(h%i==0)
  {isPrime=0;
   break;}
 }
 return isPrime;
}

结果只有16分,过了一组数据,我前思后想,刚开始一直以为后面dfs部分以及主函数部分有错误,修改了初始化数据和边界后,唯一通过的数据也wrong answer,开始怀疑是否是素数判断有问题,参考了大佬的代码,单独提出来修改,修改后的代码:

int isPrime(int h)
{
 for(int i=2;i<=sqrt(h);i++)
  {if(h%i==0)
  return 0;}
  return 1;
}

我把bool函数改成了int函数,第二遍提交时;素数判断中for循环的}放在了return 1;后面,结果依旧才34分,下载了测试数据之后,修改}位置,结果AC,后来发现若按照最初位置,一直都为1.bool函数运用不熟练,有时会产生一种刻意的躲避,在return上面也会出错,这一方面要多练习练习。

2、南蛮图腾:南蛮图腾 - 洛谷

题意:求3个大小为n-1的图形组成的大小为n的图形(左复制,上复制)

发现除了在实验课上写过关于图形的题之外,其它很少写这种输出为图形的题,在读题时看到之后,就赶紧开始着手挑战,但一直没发现规律,后来查资料发现是个谢尔宾斯基三角形。看大佬的题解,倒置输出?看懂了但没调试出来,还是尝试用字符串,相当于把基础图形画出来,然后用一个深搜,将字符串复制,但要注意空格的数量(这修改了好久)!

部分代码:

void dfs (int t,int b,string ss)
{  if (t==x)
    {   for (int i=0;i<b;i++)
        cout << s[i] << endl;
           return ;}
    string st=""; int i;
    for (i=b*2;i>=b;i--)
        {   s[i]=s[i-b]+st+s[i-b];
            if (i%2==0 && 2*b-i>=2)
                st=st+"  ";}
    for (int i=b-1;i>=0;i--)
    { s[i]=ss+s[i];}
    dfs(t+1,b*2,ss+ss);
    return ;}

3、Why Did the Cow Cross the Road III S:[USACO17FEB]Why Did the Cow Cross the Road III S - 洛谷

题意:把路当作边界,求每个连通块中牛的数量并配对不在同一块中的牛

这道题的题意我理解了好久,直到参考了一下题解后,才明白这是一个有关连通块的问题,但是该如何完整的表示出来呢,最初的思路是先找到牛,确定好每一块儿牛的数量之后标记数量,最后配对。想的很完美,写的时候就乱了,定义的变量很多,数据存不下,看了看大佬们的题解,使用了三维数组或四维数组,如果这让我自己写是很困难的。

4、医院设置:医院设置 - 洛谷

题意:求出每个节点所连通的所有节点数字与链接数量乘积之和,输出最小的和

题意理解的很快,代码也写得比较顺利的一个题😀关于搜索的部分:从医院的设置点的往四周搜索,边搜索边累加,将每个点的最短路径都算出来,然后累加,最后进行比较,输出最小值。写的时候尝试了一下memset()函数,一开始把它当成了类似于main函数一样,在内部写语句,一直编译错误,最后memset(st,0,sizeof(st));一句结束。

5、道路修建:[NOI2011] 道路修建 - 洛谷

题意:求路的修建总费用,道路长度乘以该条道路两边节点数的差值

最初想的是求每一个子树的大小,dfs遍历,统计每个子树的大小,但是要注意求的是用一条边把n个点分成两部分的差值。第一次提交只有5分,不解,后来自己测试了几组数据,发现与正确答案相差的数是差值的两倍 !没取绝对值 

ansc=abs(n-size[y]-size[y]);

这种错误虽然改的时候好改,但找的时候麻烦,在模拟了很多情况之后,手算多次结果之后,都没有发现,因为手算的时候自动取了正数。

还有许多题等着我去练习,希望在之后的做题过程中,能快速分析总结出题意,避免小错误,在运用知识点时能够更加熟练,写代码的速度也要提升。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值