社区讨论

50分求调,WA4和7

P14915「QFOI R3」算法竞赛参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mkcbyr4r
此快照首次捕获于
2026/01/13 16:29
上个月
此快照最后确认于
2026/01/13 16:29
上个月
查看原帖
CPP
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 1e5+10;
ll n,k,d,cnt;
ll a[N]; 
int main(){
	cin>>n>>k>>d;
	for(int i = 1; i <= n; i++) cin>>a[i];
	sort(a+1,a+1+n); 
	//for(int i = 1; i <= n; i++) cout<<a[i]<<" ";
	//cout<<endl;
	ll l=1,r=1,peoz=0;//人数增量
	while(l <= r && l <= n && r <= n){
		//cout<<l<<" "<<r<<" "<<cnt<<endl;
		if(r == n && a[r]-a[l] <= d){cnt += k-(r-l+1); break;}
		if(l == r){r++; continue;} 
		if(r-l+1+peoz == k && a[r]-a[l] <= d){l = ++r; cnt += peoz; peoz = 0; continue;} 
		if(a[r] - a[l] <= d) r++;
		else{//>d
			if(d == 0){cnt += k-(r-l); peoz = 0; l = r; continue;} 
			peoz = (a[r]-a[l]) / d;
			if((a[r]-a[l]) % d == 0) peoz--;//间隔刚好整数,模拟一下就懂 
			if(peoz+2 > k){//l和r差太多不能在一队 
				cnt += k - (r-l+1-1);//r不算要-1
				l = r; 
				peoz = 0;
			}
			else if(peoz+2 == k){cnt += peoz; l = ++r; peoz = 0;} //刚好凑一队
			else l = ++r;//凑不满一队
		}
	}
	cout<<cnt<<endl; 
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...