1 条题解

  • 0
    @ 2025-11-26 21:02:55

    Written by @Yue_chen

    题意:

    给n个字符串,可以任意两两拼接无限次,最多能拼多少个“603”

    思路:

    由样例可知,603串必须仅包含603串,如6031、9603等都是不合法的;

    因此,记录603的所有子串“603”,“60”,“03”,“6”,“0”,“3”;

    然后进行贪心,优先选择用最长的串:

    ans += cnt("603");

    ans += min(cnt("60"), cnt("3"));

    ans += min(cnt("6"), cnt("03"));

    ans += min({cnt("6"), cnt("0"), cnt("03")});

    计算的时候记得将已经统计的串去除,cnt为该串出现的次数,可以使用map,哈希等方式保存。

    时间复杂度O(nlog2****n)

    AC代码:

    #include<bits/stdc++.h>
    using namespace std;
    
    using i64 = long long;
    
    void solve() {
        map<string, int> mp;
        int n; cin>>n;
        
        for(int i=1; i<=n; ++i) {
            string s; cin>>s;
            mp[s]++;
        }
        
        i64 ans = 0;
        ans += mp["603"];
        
        int mn = min(mp["60"], mp["3"]);
        ans += mn;
        mp["60"] -= mn;
        mp["3"] -= mn;
        
        mn = min(mp["6"], mp["03"]);
        ans += mn;
        mp["6"] -= mn;
        mp["03"] -= mn;
        
        mn = min({mp["6"], mp["0"], mp["3"]});
        ans += mn;
        
        cout<<ans<<"\n";
    }
    
    signed main(void) {
        ios::sync_with_stdio(false); cin.tie(nullptr);
        
        int t=1;// cin>>t;
        while (t--) solve();
        return 0;
    }
    
    • 1

    信息

    ID
    116
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    227
    已通过
    58
    上传者