自己建设网站模版山东聊城建设学校官网
news/
2025/9/23 5:13:14/
文章来源:
自己建设网站模版,山东聊城建设学校官网,诚聘php网站开发师,深圳最大的软件公司ABC322刷题记
T1.A
A - First ABC 2。
妥妥的简单题……
用find函数做就行。#xff08;如果不存在那个子串就返回-1#xff0c;否则返回第一次出现位置#xff09;
注意题目中编号是从1开始的。
时间复杂度#xff1a;O(log(n))。find函数有一定代价#xff0c;我记…ABC322刷题记
T1.A
A - First ABC 2。
妥妥的简单题……
用find函数做就行。如果不存在那个子串就返回-1否则返回第一次出现位置
注意题目中编号是从1开始的。
时间复杂度O(log(n))。find函数有一定代价我记得是log。
#includebits/stdc.husing namespace std;string str;int n0;int main(){ scanf(%d,n); cinstr; //输入 str str; //处理把0开头改成1开头 printf(%d\n,str.find(ABC)); //输出答案 return 0;}
T2.B
B - Prefix and Suffix。
前两题都一样简单。
用substr截取出t中与s长度相同的前缀和后缀分别和s比较即可。
时间复杂度先不算了因为肯定够。
#includebits/stdc.husing namespace std;int m0,n0;string s,t;int main(){ scanf(%d%d,n,m); cinst; //输入 string frontt.substr(0,n),reart.substr(m-n,n); //去除前缀与后缀 if(frontsrears){ printf(0\n); }else{ if(frontsrear!s){ printf(1\n); }else{ if(front!srears){ printf(2\n); }else{ printf(3\n); } } } //对号入座输出不错 return 0;}
T3.C
C - Festival。
还是辣墨简单……
用b数组记录某一天是否有烟花在用ans数组从后往前算其中ans[i]表示离第i天最近并且时间不比第i天早的放烟花的日子与第i天相差多少。
最后从1到n输出ans的对应项即可。
时间复杂度O(n)应该是最优的思路了。
#includebits/stdc.h#define M 220000#define N 220000using namespace std;int ans[N]{},a[M]{},m0,n0;bool b[N]{};int main(){ scanf(%d%d,n,m); for(int i1;im;i){ scanf(%d,a[i]); b[a[i]]true; } //输入并维护b数组 for(int in;i1;i--){ if(b[i]true){ ans[i]0; //①当前这一天就有烟花距离为0 }else{ ans[i]ans[i1]1; //②当前这一天没有烟花比明天的距离多一天 } } //计算ans for(int i1;in;i){ printf(%d\n,ans[i]); } //输出答案 return 0;}
T4.D
D - Polyomino。
客观来说我这道题没做出来真有些丢人。
其实就是一个dfs但是一个变量名害我找了1天6小时34分钟……
我们定义一个结构体存储一块牌如果一个坐标上有点就记录为1否则记录为0。支持项各个方向平移如果会出格就返回不能做否则返回操作成功、顺时针旋转、逆时针旋转操作当然还要封装加法把骨牌拼接起来其实就是相同坐标的点记录的数相加如果相加后和为0就说明这里本来就没有点如果为1就说明刚好有一个牌上有如果大于1就说明有多个牌子上面有这个点当然只有当3块牌都记起来之后和为1才能说明这种摆法可能合法、等于号骨牌完全相同用于判断拼完之后是不是和满牌相同。
在dfs中我们不难证明先旋转遍历旋转次数去时顺时针回时逆时针在平移反方向的平移互相作为返回操作是不会有问题的当然要注意平移可以项各种方向平移多次。
最终大体流程是这样使用dfs遍历三个牌的操作如果最后拼起来是满牌就说明可以达成目的直接标记最终答案为“可行”并一路退出回到主程序否则继续往下遍历。遍历操做时先考虑旋转再考虑平移。最后输出Yes/No即可。
时间复杂度不好算这里不展开描述但是数据量都是4、16这类数估计也没啥事。
#includebits/stdc.husing namespace std;struct Info{ int num[4][4]; Info operator(Info ot){ Info ret{}; for(int i0;i4;i){ for(int j0;j4;j){ ret.num[i][j]num[i][j]ot.num[i][j]; } } return ret; } //拼接 bool operator(Info ot){ for(int i0;i4;i){ for(int j0;j4;j){ if(num[i][j]!ot.num[i][j]){ return false; } } } return true; } //判等 bool down(){ for(int i0;i4;i){ if(num[3][i]1){ return false; } } for(int i3;i1;i--){ for(int j0;j4;j){ num[i][j]num[i-1][j]; } } for(int i0;i4;i){ num[0][i]0; } return true; } //下移 bool left(){ for(int i0;i4;i){ if(num[i][0]1){ return false; } } for(int i0;i2;i){ for(int j0;j4;j){ num[j][i]num[j][i1]; } } for(int i0;i4;i){ num[i][3]0; } return true; } //左移 bool right(){ for(int i0;i4;i){ if(num[i][3]1){ return false; } } for(int i3;i1;i--){ for(int j0;j4;j){ num[j][i]num[j][i-1]; } } for(int i0;i4;i){ num[i][0]0; } return true; } //右移 bool up(){ for(int i0;i4;i){ if(num[0][i]1){ return false; } } for(int i0;i2;i){ for(int j0;j4;j){ num[i][j]num[i1][j]; } } for(int i0;i4;i){ num[3][i]0; } return true; } //上移 void spina(){ Info ret{}; for(int i0;i4;i){ for(int j0;j4;j){ ret.num[i][j]num[3-j][i]; } } memcpy(num,ret.num,sizeof(num)); return; } //顺时针旋转 void spinb(){ Info ret{}; for(int i0;i4;i){ for(int j0;j4;j){ ret.num[i][j]num[j][3-i]; } } memcpy(num,ret.num,sizeof(num)); return; } //逆时针旋转};Info inf[10]{};bool ansfalse;inline void dfs(int d);//深度优先搜索用到函数inline void tmovew(int d);//遍历旋转用完后返回原始状态inline void tmovex(int d);//遍历横移用完后返回原始状态inline void tmovey(int d);//遍历竖移用完后返回原始状态int main(){ inf[4]{{{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}}}; //满牌 for(int i0;i4;i){ string str; cinstr; for(int j0;j4;j){ if(str[j]#){ inf[1].num[i][j]1; } } } for(int i0;i4;i){ string str; cinstr; for(int j0;j4;j){ if(str[j]#){ inf[2].num[i][j]1; } } } for(int i0;i4;i){ string str; cinstr; for(int j0;j4;j){ if(str[j]#){ inf[3].num[i][j]1; } } } //输入并处理成Info格式 dfs(1); //dfs if(ansfalse){ printf(No\n); }else{ printf(Yes\n); } //根据答案输出 return 0;}inline void dfs(int d){ if(d4){ //3个骨牌遍历完成 if(inf[1]inf[2]inf[3]inf[4]){ anstrue; //若相加为满牌就说明答案可行直接记录答案为“Yes”或者说true } return; //递归出口 } if(anstrue){ return; //已经找到答案无需继续遍历 } tmovew(d); //开始遍历旋转 return;}inline void tmovew(int d){ for(int i0;i3;i){ for(int j1;ji;j){ inf[d].spina(); } //顺时针旋转相应次 tmovex(d); //往下遍历横移 for(int j1;ji;j){ inf[d].spinb(); } //逆时针转回去回溯 } return;}inline void tmovex(int d){ for(int i0;i4;i){ int sum0; //尽最大可能地往相应方向移动i次sum记录实际上操作成功的次数后面所有的sum都同理 for(int j1;ji;j){ if(inf[d].left()true){ sum; } } //往左移动 tmovey(d); //往下遍历竖移 for(int j1;jsum;j){ inf[d].right(); } //往右移动也就是回溯 } for(int i0;i4;i){ int sum0; for(int j1;ji;j){ if(inf[d].right()true){ sum; } } //往右移动 tmovey(d); //往下遍历竖移 for(int j1;jsum;j){ inf[d].left(); } //往左移动也就是回溯 } return;}inline void tmovey(int d){ for(int i0;i4;i){ int sum0; for(int j1;ji;j){ if(inf[d].down()true){ sum; } } //往下移动 dfs(d1); //往下递归 for(int j1;jsum;j){ inf[d].up(); } //往上移动也就是回溯 } for(int i0;i4;i){ int sum0; for(int j1;ji;j){ if(inf[d].up()true){ sum; } } //往上移动 dfs(d1); //往下递归 for(int j1;jsum;j){ inf[d].down(); } //往下移动也就是回溯 } return;}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/911443.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!