• C. Menorah(思维+数字反转)


    Problem - 1615C - Codeforces

    光明节烛台上有n支蜡烛,其中一些蜡烛最初被点燃。我们可以用一个二进制字符串s来描述哪些蜡烛被点燃,其中第i根蜡烛被点燃,当且仅当si=1。


    最初,蜡烛的光亮是由一个字符串a描述的。在一个操作中,你选择一个当前被点燃的蜡烛。通过这样做,你选择的蜡烛将保持点亮,而其他每根蜡烛都将发生变化(如果它是点亮的,它将变成不亮,如果它是不亮的,它将变成亮的)。

    你的任务是确定这是否可行,如果可行,找出所需的最少操作数。

    输入
    第一行包含一个整数t(1≤t≤104)--测试案例的数量。接着是t个案例。

    每个测试案例的第一行包含一个整数n(1≤n≤105)--蜡烛的数量。

    第二行包含一个长度为n的字符串a,由符号0和1组成--灯光的初始模式。

    第三行包含一个长度为n的字符串b,由符号0和1组成--期望的灯光模式。

    保证n的总和不超过105。

    输出
    对于每个测试案例,输出将a转化为b所需的最少操作数,如果不可能,则输出-1。

    例子
    inputCopy
    5
    5
    11010
    11010
    2
    01
    11
    3
    000
    101
    9
    100010111
    101101100
    9
    001011011
    011010101
    输出拷贝
    0
    1
    -1
    3
    4
    注意
    在第一个测试案例中,两个字符串已经相等,所以我们不需要进行任何操作。

    在第二个测试案例中,我们可以进行一次操作,选择第二个蜡烛,将01转化为11。

    在第三个测试案例中,不可能进行任何操作,因为没有点燃的蜡烛可以选择。

    在第四个测试案例中,我们可以执行以下操作,将a转化为b。

    选择第7支蜡烛。100010111→011101100.
    选择第2根蜡烛。011101100→110010011.
    选择第1根蜡烛。110010011→101101100.
    在第五个测试案例中,我们可以进行以下操作,将a转化为b。

    选择第6根蜡烛。001011011→110101100
    选择第2根蜡烛。110101100→011010011
    选择第8根蜡烛。011010011→100101110
    选择第7根蜡烛。100101110→011010101
    题解:
    根据题目所给操作我们观察到

    如果同一个位置操作一次,当前位置不变,其他位置都会改变

    如果操作两次,都不会发生任何变化

    如果两个不同的位置操作一次,除这两个位置外的都不会变化

    这两个位置的数会发生交换

    所以题就变成了交换两个位置的数,是序列1变为2

    假如此时位置不同

    如果

    ai = 1 ai = 0 ai = 0 ai = 1

    bi = 0 bi = 1 bi = 1 bi = 0

    可以发现如果a与b不同位置的0,1数目相同,0与1的数目必然相同

    交换次数为偶数 = 不同位置的数目

    如果不同位置为奇数

    我们可以先做一次变换

    本来为1的位置,除了我们变化的位置,其他均为0,本来为0的位置,全为1

    如果此时情况符合刚才我们讨论的情况,就是可以

    1. #include<iostream>
    2. #include<algorithm>
    3. #include<cstring>
    4. #include<string>
    5. #include<map>
    6. #include<vector>
    7. #include<queue>
    8. using namespace std;
    9. #define int long long
    10. string a,b;
    11. int n,k;
    12. void solve()
    13. {
    14. int n;
    15. cin >> n >> a>>b;
    16. if(a == b)
    17. {
    18. cout<<"0\n";
    19. return ;
    20. }
    21. int x1 = 0,x2 = 0,y1 = 0,y2 = 0;
    22. for(int i = 0;i < n;i++)
    23. {
    24. if(a[i] != b[i])
    25. {
    26. if(a[i] == '1')
    27. {
    28. x1 ++;
    29. }
    30. else
    31. {
    32. x2++;
    33. }
    34. }
    35. else
    36. {
    37. if(a[i] == '1')
    38. {
    39. y1++;
    40. }
    41. else
    42. {
    43. y2++;
    44. }
    45. }
    46. }
    47. int res = 1e9;
    48. if(x1 == x2)
    49. {
    50. res = min(res ,x1+x2);
    51. }
    52. if(y1)
    53. {
    54. y1--;
    55. if(y1 == y2)
    56. {
    57. res = min(res ,y1+y2+1);
    58. }
    59. }
    60. if(res == 1e9)
    61. {
    62. cout<<"-1\n";
    63. }
    64. else
    65. {
    66. cout<<res<<"\n";
    67. }
    68. }
    69. signed main()
    70. {
    71. // ios::sync_with_stdio(false);
    72. // cin.tie(0);
    73. // cout.tie(0);
    74. int t = 1;
    75. cin >> t;
    76. while(t--)
    77. {
    78. solve();
    79. }
    80. }
    81. //1 10 11
    82. //001
    83. //010
    84. //011
    85. //100

  • 相关阅读:
    分布式数据库九大发展趋势|文末附完整报告下载
    Spark中的闭包引用和广播变量
    软件测试工程师的职业规划
    用于物体识别和跟踪的下游任务自监督学习-2-背景
    如何通过Java导出带格式的 Excel 数据到 Word 表格
    机器学习中的“泛化”:模型过拟合与欠拟合,到底怎么回事?
    异常检测算法分类总结(含常用开源数据集)
    再次尝试放出被屏蔽的百度蜘蛛网段
    【BOOST C++ 19 应用库】(3)Boost.Archive
    [附源码]JAVA毕业设计红河旅游信息服务系统(系统+LW)
  • 原文地址:https://blog.csdn.net/m0_64158084/article/details/128108851