求助,18分
查看原帖
求助,18分
561178
jyssh楼主2024/11/11 14:44

我考虑的是先对原数组进行排序,然后最大的数字a[n]肯定是0次不可移动,然后从n-1往1去推不可移动次数 那么对于a[i]就考虑a[i+1] - a[i]和增值m的关系

如果a[i+1]-a[i] <= m,那a[i]+m肯定会影响排名,必须等a[i+1]调整完才能给a[i]+m,所以a[i]的不可移动次数 = a[i+1]的不可移动次数+1

如果a[i+1]==a[i],那么它们我是想着继承不可移动次数,但是这里的正确性没有验证

同时如果a[i + 1] - a[i] > m说明a[i]+m是不会影响排名的,那么a[i]继承a[i+1]的不可移动次数就行

但是提交只得18分,不太清楚错误的原因,求大佬指点

#include<bits/stdc++.h>
#define f(i,s,e) for(int i = s; i <= e; i++)
#define ll long long
using namespace std;
const int N = 2e5+10,inf = 0x3f3f3f3f;
struct node{
	ll id,x,k;
};
node a[N];
int n,m;
bool cmp(node a,node b)
{
	return a.x < b.x;
}
bool cmp2(node a,node b)
{
	return a.id < b.id;
}
int main()
{
	cin >> n >> m;
	f(i,1,n)
	{
		scanf("%lld",&a[i].x);
		a[i].id = i,a[i].k = 0;
	}
	sort(a + 1, a + 1 + n, cmp);
	for(int i = n - 1; i >= 1; i--)
	{
		if(a[i].x == a[i + 1].x) a[i].k = a[i + 1].k; //相邻数值继承不可移动次数 
		else if(a[i + 1].x - a[i].x <= m) a[i].k = a[i + 1].k + 1; //相邻差小于等于m,会影响排名,所以要等a[i+1]调整完后自己才能调整 
		else if(a[i + 1].x - a[i].x > m) a[i].k = a[i + 1].k; //相邻差大于m,说明无额外不可移动次数,只需要等待a[i+1]移动完自己就能移动 
	}
	sort(a + 1, a + 1 + n, cmp2); //复原输出 
	f(i,1,n)
		cout << a[i].k << " ";
	return 0;
}






2024/11/11 14:44
加载中...