[题解]CF76B Mice
思路
比较简单的贪心。
对于可以选择两个奶酪的老鼠,我们先将它们忽略掉。现在所有老鼠所吃的奶酪是唯一确定的。
考虑加上可以选择两个奶酪的老鼠如何选择。显然,如果它可以选择一个没有任何老鼠吃过的奶酪,它必然这样选择。
其次,如果它可以选择的奶酪被吃掉的时间 与它到达奶酪的时间 相同,则可以选择共享。
并且可以证明如果这个老鼠不满足上述所有情况,也不会对答案产生影响。
如下是简单的证明过程:
令这个在 位置上的老鼠走到的奶酪位置分别为 ,则有 。
由于老鼠两两之间位置不同,并且奶酪两两之间位置不同。因此对于同一块奶酪,最多只会有两只老鼠共享。假设这两个位置为 ,并且 。
进行一个简单的分讨:
-
,显然答案不变,因为前者比后者率先到达目的地。
-
。因为 ,因此 ,但是此时离 最近的点是 ,不可能出现此情况。
由此得证。
Code
#include <bits/stdc++.h>
#define re register
using namespace std;
const int N = 1e5 + 10,inf = 1e9 + 10;
int n,m,_,sum;
int x[N],xx[N];
int Min[N],cnt[N];
struct point{
int l,r,dist;
};
vector<point> v;
inline int read(){
int r = 0,w = 1;
char c = getchar();
while (c < '0' || c > '9'){
if (c == '-') w = -1;
c = getchar();
}
while (c >= '0' && c <= '9'){
r = (r << 3) + (r << 1) + (c ^ 48);
c = getchar();
}
return r * w;
}
int main(){
n = read(),m = read();
_ = read(),_ = read();
for (re int i = 1;i <= n;i++) x[i] = read();
for (re int i = 1;i <= m;i++){
xx[i] = read(); Min[i] = inf;
}
xx[0] = -inf; xx[m + 1] = inf;
for (re int i = 1,j = 1;i <= n;i++){
while (j < m && xx[j] < x[i]) j++;
int a = abs(x[i] - xx[j - 1]),b = abs(x[i] - xx[j]);
if (a < b){
if (Min[j - 1] > a){
Min[j - 1] = a; cnt[j - 1] = 1;
}
else if (Min[j - 1] == a) cnt[j - 1]++;
}
else if (a > b){
if (Min[j] > b){
Min[j] = b; cnt[j] = 1;
}
else if (Min[j] == b) cnt[j]++;
}
else v.push_back({j - 1,j,a});
}
for (point p:v){
if (Min[p.l] == p.dist) cnt[p.l]++;
else if (Min[p.r] == p.dist) cnt[p.r]++;
else if (!cnt[p.l]){
Min[p.l] = p.dist; cnt[p.l] = 1;
}
else if (!cnt[p.r]){
Min[p.r] = p.dist; cnt[p.r] = 1;
}
}
for (re int i = 1;i <= m;i++) sum += cnt[i];
printf("%d",n - sum);
return 0;
}
作者:WaterSun
出处:https://www.cnblogs.com/WaterSun/p/18365166
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】