3 算法题小总结

目录
1.未来之迷
思路
代码展示
2.不要分心
思路
代码展示
3.过河卒
思路
代码展示
4.地毯
思路
代码展示
5.最小新整数
思路
代码展示
6.宇航员
思路
代码展示
1.未来之迷
/**在2022年,Mike发现了两个长度为n的二进制整数a和b(它们都只由数字0和1表示),前导可以有0 。为了不忘记它们,他想用以下方式构造整数d:
他创建了一个整数c作为a和b的位和的结果,没有转移进位,所以c可能有一个或多个2 。例如,0110与1101的按位求和的结果是1211,或者与的和是;
Mike将c中相等的连续数字替换为1位,得到d 。在上述情况下,进行此操作后,1211变成了121,变成了020(所以d没有相等的连续数字) 。
不幸的是,迈克在自己计算d之前就失去了整数a 。现在,为了让他高兴起来,你要找到任何长度为n的二进制整数a使d作为整数的最大值 。
最大可能的整数表示102>21,012 输入
第一行包含单个整数t(1≤t≤1000)-测试用例的数量 。
【3算法题小总结】每个测试用例的第一行包含整数n(1≤n≤10^5) a和b的长度 。
每个测试用例的第二行包含长度为n的二进制整数b 。整数b仅由数字0和1组成 。
它保证了n对所有t个测试用例的总和不超过10^5 。
输出
对于每个测试用例输出一个长度为n的二进制整数a 。注意,a或b可以有前导0,但必须有相同的长度n 。
请注意
在第一个测试用例中,b=0,选择a=1,结果是d=1 。
在第二个测试用例中,b=011所以:
如果a=000, c = 011,那么d=01;
如果a=111, c = 122,那么d=12;
如果选a=010,得到d=021 。
如果你选择a=110,你会得到d=121 。
我们可以证明答案a=110是最优的,而d=121是最大可能的 。
在第三个测试案例中,b=110 。如果选a=100,就得到d=210,这是d的最大值 。
在第四个测试用例中,b= 。如果你选择a=,你会得到d=,这是最大可能的d 。
在第五个测试用例中,b= 。如果你选择a=,你会得到d=,这是最大可能的d 。*/
思路
注意组合出来的数字,若相邻两个数字相同,则会合并,而A的每一位数字均由0或1组成,要使得C最大,则第一位取1,后面的数字尽量往大了取,并且保证与上一位不重复 。
代码展示
#includeint main(){int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);getchar();int i,b=0,a[100005]={0};while((a[b]=getchar())!='\n')b+=1;printf("1");a[0]++;for(i=1;i
2.不要分心
/* has 26 tasks. Each task isby aof the Latin .
Theaskedto solve tasks in theway: ifbegan to solve some task, then he must solve it to the end,beingbytask. Aftertotask,to thetask.
can only solve one taskthe day. Every day he wrote down what task he . Now thewants to know ifhis .
For , iftasks in theorder: “”, then thewill see that on the third daybegan to solve the task ‘B’, then on the fifth day he gotand began to solve the task ‘C’, on thedayto the task ‘B’. Otherof when theis : “BAB”, “” and “”.
Ifthe tasks as : “”, then thehave any .note thatis notto solve all tasks. Otherof when thedoesn’t have any : “BA”, “” and “YYYYY”.
Helpfind out if hismight be .
Input
The first lineant (1≤t≤1000). Then t test cases .
The first line of each test caseonen (1≤n≤50) — theof dayswhichtasks.
Thelineaofn,ofLatin , which is the order in whichthe tasks.