post-2023118-kao-shi-zong-jie

2023/1/18考试总结

posted on 2023-01-18 08:04:17 | under 总结 | source

本次考试一共 3.5h,4 道题目。在此,我有一次收获了一条教训:对拍造数据时不只要极限数据,小的也要来一些。。。

本次是高级搜索的专项赛,所以全是 IDA* 和双向搜索。

T1——DNA sequence

我们可以发现字符串的总长度最多只有 5×10=50,很小,可以迭代加深。

但这明显不优秀,我们可以找一个估价函数 h 来估价。比如我用的这个:

  int h(){
      int x1,x2,x3,x4;x1=x2=x3=x4=0;
      for(int i=1;i<=n;i++){
          int a=0,b=0,c=0,d=0;
          for(int j=sta[i]+1;j<=len[i];j++){//sta为现在匹配到了哪一位,len为长度
              if(s[i][j]=='A')a++;
              if(s[i][j]=='C')b++;
              if(s[i][j]=='G')c++;
              if(s[i][j]=='T')d++;
          }
          x1=max(x1,a);
          x2=max(x2,b);
          x3=max(x3,c);
          x4=max(x4,d);
      }
      return x1+x2+x3+x4;
  }

这个估价求出了四个字母在每个字串中出现次数的最大值的加和,这显然是小于等于真实值的。因为对于一个字串,如果它未匹配的部分有两个字母 A,那么显然我们至少还要在答案串中加入两个 A。其他字母同理。

然后就可以快乐地搜索了。

但是我的代码把字符串的长度全都当做了 4,然后对拍全卡极限数据,结果 T 完了。。。

T2——十一迷宫

直接双向搜索,康托标记就好了,还有一个看起来没什么用的优化,就是我们发现所又目标状态都是一样的,所以我们可以直接先从目标状态搜索 10 步,然后就可能会优化一点(吧?)

T3——无题

依旧是 IDA*,我们的估价函数 h 这次取行中最劣的一行需要的步数与列中最劣的一列所需步数取小值。即:

int h(){
	int x=10,y=10;
	for(int i=1;i<=4;i++){//行中
		int k[5]={};
		for(int j=1;j<=4;j++)k[a[i][j]]++;
		for(int j=1;j<=4;j++)k[0]=max(k[0],k[j]);
		x=min(x,k[0]);//取最劣
	}
	for(int i=1;i<=4;i++){//列中
		int k[5]={};
		for(int j=1;j<=4;j++)k[a[j][i]]++;
		for(int j=1;j<=4;j++)k[0]=max(k[0],k[j]);
		y=min(y,k[0]);//取最劣
	}
	return 4-max(x,y);//取其优者
}

T4——铁盘整理

考试时被最大数据卡得怀疑人生,最后老师说他把 20 打成 50 了。。。

这里如果我们翻转铁盘 1 到铁盘 i,那么只有铁盘 i+1 与它前一个铁盘的差发生了有意义的变化(被翻转的区间内也会有,但对此次操作无贡献),所以我们理所当然地得到估价函数 h

  a[n+1].R=n+1;
  inline int h(){
      int res=0;
      for(int i=1;i<=n;i++)res+=(abs(a[i].R-a[i+1].R)!=1);//与其后面的铁盘并不相配,其中R是在所有盘中第R小
      return res;
  }

std

posted @   Grisses  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
Document
点击右上角即可分享
微信分享提示