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;
}

浙公网安备 33010602011771号