题意
现有 n 块蛋糕占据[a_i-w,a_i+w] 的位置,蛋糕之间没有公共点; n 个分配器能在 [b_i-h,b_i+h] 范围分配巧克力,分配器的分配范围之间不重叠。请问能否借助运输机平移一次所有的蛋糕,使得分配器能为所有蛋糕分配巧克力,且不会有巧克力落在蛋糕外。
分析
由于蛋糕和分配器一一对应,假设每个蛋糕都移动了d,所以需要解不等式组:
a[i]-w+d<=b[i]-h<=b[i]+h<=a[i]+w+d;
化简得:b[i]+h-a[i]-w<=d<=b[i]-h-a[i]+w;
也就是求每一个a[i]中d的取值范围再看交集是否为空。
ac代码:
#include<bits/stdc++.h>
using namespace std;
#define yes cout<<"YES"<<"\n";
#define no cout<<"NO"<<"\n";
using ll = long long;const int N = 1e6 + 10;const int MOD = 1e9 + 7;
inline int gcd(int a, int b)
{ return b > 0 ? gcd(b, a % b) : a;}
inline void solution() {
int n, w, h;
cin >> n >> w >> h;
vector<int>a(n);
vector<int>b(n);
for (int i = 0; i < n; i++) { cin >> a[i]; }
for (int i = 0; i < n; i++) { cin >> b[i]; }
int left = -1e9, right = 1e9;
for (int i = 0; i < n; i++)
{ left = max(left, b[i] + h - w - a[i]);
right = min(right, b[i] - h + w - a[i]);
}
if (right >= left) cout << "YES\n";
else cout << "NO\n";
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t; cin >> t;
while (t--) {
solution();
}
}