零点工作室暑假集训(AtCoder--ABC255)

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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值