2020 ICPC 亚洲区域赛(南京)L Let‘s Play Curling

2020 ICPC 亚洲区域赛(南京)L Let’s Play Curling
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
思路分析:
其实这个题,一开始的思路拐进了一个很奇怪的角落,因为是绝对值嘛,所以总想着平方去掉绝对值,然后就是很长一段时间的无功而返,后来因为队友说了句数轴,思路开始转向了将这些数据转换到数轴上,然后就发现了这个题用数轴来理解非常好理解,其实就是找相邻两蓝色点内,红色点最多的个数,如果没有则输出Impossible。

建议动手画一下数轴,这里就不再画了。

所以说这个题,告诉我,绝对值,不一定非要平方(诶,感觉有点高中思维的影子),将问题可视化的转换为一个数学问题不失为一个好方法,数轴的转变就特别巧妙,绝对值也变成了点与点之间的距离,然后加上自己的理解,就能快乐AC啦~

AC代码:

#include <bits/stdc++.h>

#define ll long long
const ll N = 1e5 + 10;
using namespace std;

int a[N];
int b[N];

int main() {
    
    
    int t;
    scanf("%d", &t);
    ll n, m;
    while (t--) {
    
    
        scanf("%lld%lld", &n, &m);
        for (ll i = 0; i < n; i++) {
    
    
            scanf("%lld", &a[i]);
        }
        for (ll i = 0; i < m; i++) {
    
    
            scanf("%lld", &b[i]);
        }
        sort(a, a + n);
        sort(b, b + m);
        b[m] = 1e9 + 10;
        ll k;
        for (k = 0; k < n; k++) {
    
    
            if (a[k] >= b[0])
                break;
        }
        ll ans = k;
        for (int i = 0, j = k; j < n && i < m; i++) {
    
    
            while (j < n && a[j] <= b[i])
                j++;
            if (j >= n)
                break;
            ll rec = j;
            while (j < n && a[j] < b[i + 1])
                j++;
            ans = max(ans, j - rec);
        }
        if (ans == 0) {
    
    
            printf("Impossible\n");
        } else
            printf("%lld\n", ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45654671/article/details/112416182