第二题考完之后想到一个思路。本来的想着用异或来找操作的列(比特位),后来想到的方法似乎能通过,大家看看帮忙分析分析。 对于初始矩阵,对每列求和,统计1的个数,然后跟目标矩阵每列求和的结果对比(因为列的不会调换的,所以可以直接比较),如果相等,可以该列不用操作;否则,再判断两者相加是否等于N(N为行数,代表拨动该列的开关后,1的数量就相同)。 上面的条件并不完整,但是能排除错误的用例。在上面条件通过的基础上,再对两个矩阵每行进行求和,即求1的个数,然后排序(这一步可以抵消随意换行的操作)。排序后的序列相同,则两者可以相互转化;否则,输出 Impossible。 因为这里有很多列求和,行求和,所以用 Python 表示会更直白。这里写个伪码: 给定: mat1, mat2, N, L 过程: colSum1 = sum(mat1, axis=0) colSum2 = sum(mat2, axis=0) rowSum1 = sum(mat1, axis=1) rowSum2 = sum(mat2, axis=1) cnt = 0 for i in range(L): if colSum1[i] == comSum2[i]: continue else if colSum1[i] + comSum2[i] == N: cnt += 1 else: print("Impossible") return if sort(rowSum1) == sort(rowSum2): print(cnt) else: print("Impossible") 欢迎大家提出意见~~~
点赞 2

相关推荐

11-19 18:44
已编辑
成都理工大学 Java
程序员花海:我面试过100+校招生,大厂后端面试不看ACM,竞赛经历含金量低于你有几份大厂实习 这个简历整体来看不错 可以海投
如何写一份好简历
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务