zoukankan      html  css  js  c++  java
  • CodeForces 701C They Are Everywhere(map的应用)

      这个题比较好的解决办法,我觉得还是map,map的size可以很快的知道我们选了几个字母,而且可以作为计数器,知道每一个字母出现了多少次, erase函数可以清除掉一个元素。

      所以,定义两个指针L和R,当选择的数够了sum个以后,我们移动L指针,开始删除字母,直到不满足为止,然后移动R指针,看有没有其他的满足答案,并及时更新答案。

      代码及注释如下:

      ps:被这个题给虐了……(真是有愧于队友赐我的map小王子的称号……)

    #include<iostream>
    #include<cstdio>
    #include<map>
    #include<cstring>
    using namespace std;
    #define N 100010
    #define INF 99999999
    map<char,int>mp;
    char a[N];
    int sum,n;
    int main()
    {
        int ans = INF;
        cin>>n>>a;
        sum = 0;
        mp.clear();
        for(int i = 0; i < n; i++)
        {
            if(!mp[a[i]])
            {
                sum++;
                mp[a[i]] = 1;
            }
        }
    //    cout<<"sum = "<<sum<<endl;
        mp.clear();
        int l = 0,r = 0;
        while(r < n)
        {
            mp[a[r]]++;
            while(l <= r && mp.size()==sum)///直到满足条件,移动L指针
            {
                mp[a[l]]--;
                ans = min(ans,r-l+1);///必须在上面更新
                if(mp[a[l]] == 0)
                {
                    mp.erase(a[l]);///及时删除
                    l++;///不要忘记移动指针,否则会出错
                    break;
                }
                else l++;
            }
            r++;
        }
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    java server: all kinds of errors
    fragment使用的错误
    unity3d+vuforia开发增强现实例子编译
    android遇到的几个问题
    cocos2dx 特效
    cchttpclient中停止网络请求的方法
    cocos2dx 2.2.5 hitWidget->onTouchEnded(pTouch, pEvent); 异常
    将博客搬至CSDN
    ffmpeg 编译Android
    常用注解
  • 原文地址:https://www.cnblogs.com/jifahu/p/5749536.html
Copyright © 2011-2022 走看看