格蕾丝的逃离题解

方法一

暴力搜索


我们分别枚举公主和革命军的速度

60分版本
#include <bits/stdc++.h>
using namespace std;
int d,l,n,a,b,cnt;
int v[500005];
int main() {
	cin>>d>>l>>n;
	for(int i=1; i<=n; i++) {
		cin>>v[i];
	}
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++) {
			int g=v[i];
			int z=v[j];
			if(g<=z){
				continue;
			}
			if(d*z<l*(g-z)){
				cnt++;
			}
		}
	}
	cout<<cnt;
	return 0;
}

但只要我们把int改为long long,就能拿80分

80分版本
#include <bits/stdc++.h>
using namespace std;
long long d,l,n,a,b,cnt;
int v[500005];
int main() {
	cin>>d>>l>>n;
	for(int i=1; i<=n; i++) {
		cin>>v[i];
	}
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++) {
			int g=v[i];
			int z=v[j];
			if(g<=z){
				continue;
			}
			if(d*z<l*(g-z)){
				cnt++;
			}
		}
	}
	cout<<cnt;
	return 0;
}

再加一个sort排序优化一下

90分版本
#include <bits/stdc++.h>
using namespace std;
long long d,l,n,a,b,cnt;
int v[200005];
bool cmp(int x,int y) {
	return x<y;
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>d>>l>>n;
	for(int i=1; i<=n; i++) {
		cin>>v[i];
	}
	sort(v+1,v+1+n,cmp);
	for(int i=1; i<=n; i++) {
		for(int j=1; j<i; j++) {
			int g=v[i];
			int z=v[j];
			if(d*z<l*(g-z)) {
				cnt++;
			}
		}
	}
	cout<<cnt;
	return 0;
}

这就是暴力搜索的极限了

方法二

二分查找

查找第一个>=革命军追上公主的速度,剩余部分累加即可


100分版本
#include <bits/stdc++.h>
using namespace std;
long long d,l,n,a,b,cnt;
int v[200005];
bool cmp(int x,int y) {
	return x<y;
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>d>>l>>n;
	for(int i=0; i<n; i++) {
		cin>>v[i];
	}
	sort(v,v+n,cmp);
	for(int i=0; i<n; i++) {
		int g=v[i];
		int need=(g*(d+l))/l+1;
		if(need<g+1){
			need=g+1;
		}
		int erfen=lower_bound(v,v+n,need)-v;
		cnt+=n-erfen;
	}
	cout<<cnt;
	return 0;
}