Comet OJ 夏季欢乐赛 距离产生美
距离产生美
https://cometoj.com/contest/59/problem/B?problem_id=2680
题目描述
JWJU放暑假了,于是鸡尾酒就和女朋友璇璇一起出去玩。但是外面太热了,只要他们牵牵手就会手心出汗。鸡尾酒觉得在这些热的地方就应该保持距离,不然就实在热的受不了了!
现在鸡尾酒获得了一个长度为n的数组,且第i个元素为a_{i}ai
这个数组他看着都热——相邻两个元素实在太接近了。他觉得对于任意的 i(1 < i \le n)i(1<i≤n),都必须满足 |a_{i}-a_{i-1}| \ge k∣ai−ai−1∣≥k,才能被称为“凉快的数组”。
多管闲事的鸡尾酒想帮这个数组降降温。他每一次可以把一个元素改成 [0,10^{18}][0,1018] 中的任意值,请问他最少修改几个元素,才能使得这个数组变为“凉快的数组”。
输入描述
第一行一个正整数输入 n, kn,k,
接下来一行包含 nn 个正整数,依次表示 a_{i}ai
(1 \le n \le 10^{5}1≤n≤105 ,0 \le a_{i},k \le 10^{9}0≤ ai,k≤109)
输出描述
输出一行一个正整数表示最少的修改次数
样例输入 1
3 5 1 1 2
样例输出 1
1
提示
可以将中间的数字改为8,这样原数组变为[1,8,2][1,8,2],满足“凉快的数组”的定义,且这样的修改次数是最少的。(当然也有其他的方案只修改1次就使得数组满足要求)
这场比赛最水的题。
标记+模拟,轻松AC
CODE
#include<cstdio> #include<cmath> using namespace std; int n,k,ans; int a[100000001]; int main() { scanf("%d%d",&n,&k); if(n==1) { printf("0"); return 0; } for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=2;i<=n;i++) { if(a[i]==-1 || a[i-1]==-1) continue; if(abs(a[i]-a[i-1])<k) a[i]=-1,ans++; } printf("%d",ans); return 0; }