题目链接:https://codeforces.com/contest/1202
A - You Are Given Two Binary Strings...
题意:给一个二进制串x,另一个二进制串y,把y串左移若干位(可以是0位),使得他们的和倒过来的字典序最小。
题解:倒过来的字典序最小,意思就是没倒过来之前末尾要有尽可能多的0。大概想了想应该不会出现前缀都相同,某个字符串更短,这样的情况。那么y串最后的0是没什么不良影响的,就把他的最后一个1移动到与x串的某个1对齐就好了,假如y串最后一个1已经超过了x串的长度,那么就不需要移动了。
char x[100005];
char y[100005];
void test_case() {
int xlen, ylen;
scanf("%s%s", x + 1, y + 1);
xlen = strlen(x + 1);
ylen = strlen(y + 1);
int last1 = 0;
for(int j = 1; j <= ylen; ++j) {
if(y[j] == '1')
last1 = j;
}
int k = 0;
for(int i = xlen - (ylen - last1); i >= 1; --i) {
if(x[i] == '1') {
k = (xlen - i) - (ylen - last1);
break;
}
}
printf("%d\n", k);
}
好像对下标的加减关系逐渐拥有直觉。
*B - You Are Given a Decimal String...
这题不仅做过,还印象非常深刻,我是用bfs的,嗷带哥使用floyd的。
题意:有一种x-y计数器,他的初始值永远是0。每次输入只能输入x或者输入y,当输入v时,会输出当前值的最低位,然后把当前值+=v。给一个数字序列,要求从中插入最少的数字,使得这个序列变成某个x-y计数器的合法输出,对于所有的x∈[0,9],y∈[0,9],都进行一次求解。
题解:既然有当时做的印象,就不搞这么多奇奇怪怪的了,用bfs或者floyd预处理出连接两个数字时需要插入的点的数量,然后假如原序列的开头不是0则固定在原序列的开头添加0。把最短路加起来即可。这道题关键是要注意到,题目要求的插入最少数字的情况,当且仅当所给的数字序列中相邻两个位置之间都是插入最少数字才成立。