ABC 255 下分记录

  • A
    直接输出 \(A_{r, c}\) 即可。

  • B

没看数据范围,直接写的二分。

对于这个光的范围二分,然后判断合不合法即可。

int n, k;
double x[MAXN], y[MAXN];
int a[MAXN];
double ans;
#define eps 1e-6
bool vis[MAXN];
 
double dis(double a, double b, double c, double d) {
	return (double)sqrt((a - c) * (a - c) + (b - d) * (b - d));
}
 
bool Check(double mid) {
	for(int i = 1; i <= k; i++) {
		vis[a[i]] = 1; 
		for(int j = 1; j <= n; j++) {
			if(dis(x[j], y[j], x[a[i]], y[a[i]]) <= mid) vis[j] = 1;			
		}	
	}
	for(int i = 1; i <= n; i++) 
		if(!vis[i]) return false;
	return true;
}
 
signed main() {
	n = read(), k = read();	
	for(int i = 1; i <= k; i++) cin >> a[i];
	for(int i = 1; i <= n; i++) cin >> x[i] >> y[i];
	double l = 0, r = 1e8 * 1.0;
	while(l + eps < r) {
		memset(vis, 0, sizeof vis);
		double mid = (l + r) / 2.0;
//		cout << mid << "\n";
		if(Check(mid)) r = mid, ans = mid;
		else l = mid;
	}
	printf("%.16lf", ans);
}
  • C

小思维题。

分类讨论。

当这个 \(x\) 在最大值和最小值之间的时候,直接找最近的即可。

当他比最大值大 或 最小值小, 注意 \(d\) 可能为 \(\le 0\)

int x = read(), a = read(), d = read(), n = read();
	if (!d) {
		cout << max(a, x) - min(a, x);
		return 0;
	}
	int Min = a, Max = a + (n - 1) * d;
//	cout << Max << " " << Min << "\n";
	if (Min > Max) swap(Min, Max);
	if (x < Min) {
		print(Min - x);
		return 0;
	}
	if (x > Max) {
		print(x - Max);
		return 0;
	}
	if(d < 0) d = -d, t = abs(x - a) % d;
	else t = abs(x - a) % d;
	cout << min((d - t), t) << "\n";
	return 0;
}
  • D

排序后求出前缀和,二分找到位置,前后的分别讨论就行了。

int a[N], x[N], sum = 0, qzh[N];
 
signed main() {
	int n = read(), Q = read();
	for(int i = 1; i <= n; i++) a[i] = read();
	sort(a + 1, a + n + 1);
	for(int i = 1; i <= n; i++) qzh[i] = qzh[i - 1] + a[i];
	for(int i = 1; i <= Q; i++) {
		x[i] = read();
		int wz = lower_bound(a + 1, a + n + 1, x[i]) - a;
		cout << x[i] * (wz - 1) - qzh[wz - 1] + qzh[n] - qzh[wz - 1] - x[i] * (n - wz + 1) << endl;	
	}
	return 0;
 
}  
posted @ 2022-06-13 17:37  TLE_Automation  阅读(92)  评论(0)    收藏  举报