L. Let's Play Curling

思路

通过对样例的模拟,发现答案为相邻两个蓝色石子中间最多的红色石子的数量。

双指针做法:

const int N=1e5+10;
int a[N],b[N];
int n,m;
 
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n>>m;
 
        for(int i=0;i<n;i++) cin>>a[i];
        sort(a,a+n);
 
        for(int i=0;i<m;i++) cin>>b[i];
        b[m++]=0,b[m++]=INF;
        sort(b,b+m);
 
        int idx=0;
        int res=0;
        for(int i=0;i<m-1;i++)
        {
            int cnt=0;
            int l=b[i],r=b[i+1];
            while(idx < n && a[idx] <= l) idx++;
            while(idx < n && a[idx] > l && a[idx] < r)
            {
                idx++;
                cnt++;
            }
            res=max(res,cnt);
        }
 
        if(res == 0) puts("Impossible");
        else cout << res << endl;
    }
    //system("pause");
    return 0;
}

注意特判第一个蓝色石子前连续的红色石子数量,以及最后一个蓝色石子后连续的红色石子数量。

map做法:

const int N=1e5+10;
int a[N],b[N];
int n,m;
 
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n>>m;
 
        map<int,char> pos;
        map<int,int> cnt;
 
        for (int i = 0; i < n; i++)
        {
            int x;
            cin >> x;
            pos[x] = 'r';
            cnt[x]++;
        }
 
        for (int i = 0; i < m; i++)
        {
            int x;
            cin >> x;
            pos[x] = 'b';
            cnt[x] = 0;
        }
 
        int res = 0;
        int sum = 0;
        for (auto &t : pos)
        {
            if(t.se == 'r') sum += cnt[t.fi];
            else sum=0;
            res = max(res, sum);
        }
 
        if(res == 0) puts("Impossible");
        else cout << res << endl;
    }
    //system("pause");
    return 0;
}
posted @ 2021-05-15 15:22  Dazzling!  阅读(66)  评论(0编辑  收藏  举报