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
我们可以发现字符串的总长度最多只有
但这明显不优秀,我们可以找一个估价函数
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*,我们的估价函数
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 到铁盘
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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】