A - You should output ARC, though this is ABC.
题意:输入r,c,和一个2*2的矩阵a,输出a[r][c]即可
#include <bits/stdc++.h>
using namespace std;
const int N = 5;
int r, c;
int a[N][N];
int main()
{
cin >> r >> c;
for(int i = 1; i <= 2; i ++)
{
for(int j = 1; j <= 2; j ++)
{
cin >> a[i][j];
}
}
cout << a[r][c] << endl;
return 0;
}
B - Light It Up
题意:在xy平面上有N个人,编号为1,2,…,N。第i个人位于坐标(X_i,Y_i)处。其中K个人,即人A_1,A_2,…,A_K,将接收到相同强度的光。当坐标为(x,y)的人拥有强度为R的光时,它会照亮以(x,y)为中心、半径为R的圆的内部(包括边界)。找出每个人至少被一个灯照亮所需的最小光强度。(也就是告诉你有n个点,其中k个可以发光,问让每个不发光的点被照射到,问最小需要多大的光照强度(即以发光点为圆心,发光强度为半径画圆,不发光的点在圆上或者圆内)
思路:因为数据很小,所以直接把不发光的点和每个发光的点进行匹配,取这个点被光笼罩的最小值,在对于每个不发光点的最小值取最大值即可,时间复杂度是O(n的平方),因为一开始想着用光去找对应的人,取最大的,然后再取最小的答案,wa了好几次,然后就换了想法,用人去对应的找每个光先取最小的,再从这最小的里面取最大的。
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int n, k, a;
int flag[N];
double x[N], y[N];
int main()
{
cin >> n >> k;
memset(flag, 0, sizeof flag);
for(int i = 1; i <= k; i ++)
{
cin >> a;
flag[a] = 1;
}
for(int i = 1; i <= n; i ++)
{
cin >> x[i] >> y[i];
}
double ans2 = -10000000000;
for(int i = 1;i <= n; i ++)
{
if(flag[i] == 1) continue;
double ans1 = 10000000000;
for(int j = 1; j <= n; j ++)
{
if(flag[j] == 0) continue;
ans1 = min(ans1, (double)sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j])));
}
ans2 = max(ans2, ans1);
}
printf("%.6lf",ans2);
return 0;
}
C - ±1 Operation 1
题意:给定一个整数X。以下对该整数的操作被称为一次操作。
选择并执行以下操作之一:
1.将X加1。
2.将X减1。
具有N个项的等差数列S的项,其初始项为A,公差为D,被称为好数字(good numbers)。
考虑执行零次或多次操作使X成为一个好数字。找到使X成为好数字所需的最小操作次数。
思路:分情况讨论贪心.因为这个等差数列可能是递增也有可能是递减,所以我们统一把它替换成递增等差数列计算.分三个情况,当x<=首项时,直接计算首项和x的差即可,当x>=末项,直接计算末项和x的差即可.当x在等差数列范围之内,那么我们直接看x减去首项之后最近的能被公差整除的距离即可.
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e3+5, MOD = 998244353;
LL x, a1, d, n, an;
int main() {
cin >> x >> a1 >> d >> n;
an = a1 + (n - 1) * d;
if (d < 0)
{
swap(a1, an);
d = -d;
}
if (x >= a1 && x <= an)
{
if (!d) cout << 0;
else
{
x = (x - a1) % d;
cout << min(x, d - x);
}
}
else
{
if (x > an) cout << x - an;
else cout << a1 - x;
}
return 0;
}