Codeforces 1138
1138 B
题意
给你两个01串 \(a,b\) ,现在要选择 \(n/2\) 个 \(i\) 组成一个集合 \(S\) ,使得 \(\sum_{i\in S}a[i]=\sum_{j∉S}b[j]\) 。
\((2\le n\le 1500)\)
Examples
inputCopy
4
0011
0101
output
1 4
input
6
000000
111111
output
-1
input
4
0011
1100
output
4 3
input
8
00100101
01111100
output
1 2 3 6
解
设 \((1,0)\) 总个数为 \(A\) , \((0,1)\) 总个数为 \(B\) , \((0,0)\) 总个数为 \(C\) , \((1,1)\) 总个数为 \(D\) , \(i\in S\) 且 \((a[i],b[i])=(1,0)\) 个数为 \(x\) , \(i\in S\) 且 \((a[i],b[i])=(0,1)\) 个数为 \(y\) , \(i\in S\) 且 \((a[i],b[i])=(0,0)\) 个数为 \(w\), \(i\in S\) 且 \((a[i],b[i])=(1,1)\) 个数为 \(z\) 。
有: \(x+z=B-y+D-z\)
得: \(x+y+2z=B+D\)
然后只要枚举 \(x,y\) ,就能求出 \(z,w\) 。
1138 F
题意

给你一条链,一端连着一个环(全部是有向边),一开始所有人(总共10人,编号 \(\in [0,9]\) )都在最左端的节点,你可以进行最多 \(3*n\) 次操作,每次可以将若干个人向前移动一步,要你通过交互模拟出所有人到达目的地(旗子处,链和环的交点处)的过程。
每次交互,如果你要移动一步,输出next a1 a2 a3 ,a数组表示要移动的人。如果你能断定所有人已到达目的地,输出done。
每次询问后评测机会返回当前10个人被分成几块。
Example
input
2 05 12346789
3 246789 135 0
3 246789 0 135
3 246789 0 135
2 135 0246789
1 0123456789
output
next 0 5
next 0 1 3
next 2 3 0 1 4 5 6 7 8 9
next 9 8 7 6 5 4 3 2 1 0
next 0 1 3 5
next 1 3 5
done
解
有一种算法叫floyd判环(与 \(n^3\) floyd最短路算法没什么联系)
具体操作方式:任取两个人 \(a,b\) ,重复执行:
- 将 \(a,b\) 向前移动一步;
- 将 \(b\) 向前移动一步。
直到 \(a,b\) 相遇。
此时 \(a,b\) 一定在环上。
然后重复执行:
- 将所有人向前移动一步。
直到所有人相遇。
此时所有人一定在那个目的地节点上。
具体证明列一个方程模拟一下。

浙公网安备 33010602011771号