zoukankan      html  css  js  c++  java
  • 题解 【Lucky Conversion】

    【题意翻译】

    定义幸运数字为只含有“幸运字符”((4)(7))的正整数。如 (4)(7)(744) 是,而 (5)(17)(467) 不是。

    现有两个等长的字符串 (a)(b),只含“幸运字符”,对 (a) 进行下面两个操作中的任意一种:

    1)将任意一个 (a) 中的字符从 (4)(7),或者从 (7)(4)

    2)将 (a) 中任意两个字符位置互换。

    求能使 (a) 变成 (b) 的最小操作次数。

    【样例输入输出】

    【输入 #1】
    47
    74
    
    【输出 #1】
    1
    
    【输入 #2】
    774
    744
    
    【输出 #2】
    1
    
    【输入 #3】
    777
    444
    
    【输出 #3】
    3
    

    【数据规模与约定】

    (a.size,b.size leq 10^5)


    这题的结论还是比较好推的。


    读入两个串 (a,b)

    (num4) 表示 (a) 串和 (b) 串不同,且 (a) 串为 (4) 的数量;
    (num7) 表示 (a) 串和 (b) 串不同,且 (a) 串为 (7) 的数量。


    提出一个结论:最小的转换次数是 (max(num4,num7))

    证明如下:

    (a) 串和 (b) 串第 (i) 位相同时,这个位上字符不需要更改或交换,所以这个位对答案是没有影响的。

    如果不考虑交换操作的话,操作次数应该就是 (num4+num7)

    又因为交换是没有限制的,所以 (a) 串中,一个不对应的 (4) 必定可以和一个不对应的 (7) 交换,使得这两个相互对应。

    也就是说,现在一个不对应的 (4) 和一个不对应的 (7) 可以配对,只相当于一次操作次数,所以操作次数也就是
    (num4+num7-min(num4,num7)=max(num4,num7))


    经过一波伪证证明后,我们就可以愉快地使用结论了,代码也就呼之欲出了,如下:

    #include<bits/stdc++.h>
    #define rint register int
    using namespace std;
    char a[100010],b[100010];
    int num7,num4;
    int main(){
        scanf("%s%s",a+1,b+1);
        int len=strlen(a+1);
        for(rint i=1;i<=len;++i){
            if(a[i]!=b[i]&&a[i]=='4') num4++;
            if(a[i]!=b[i]&&a[i]=='7') num7++;
        }
        printf("%d",max(num4,num7));
        return 0;
    }
    

    完了awa

  • 相关阅读:
    C#如何调用非托管的C++Dll
    CList 点击表头排序 (3)两种排序的第二种
    CList 点击表头排序 (2)两种排序方法中其中一种
    CList 点击表头排序 (1)SortItems函数
    CListCtrl 隔行变色
    C++去掉字符串中首尾空格和所有空格
    Dialog和FormView如何派生通用类
    STL中erase()的陷阱
    socket 笔记(一)
    prettyJson V7.1 使用
  • 原文地址:https://www.cnblogs.com/LCGUO/p/12520046.html
Copyright © 2011-2022 走看看