【AcWing】第61场周赛


前言

经典忘记做,后来才来做的。


4497. 分糖果


4497. 分糖果

题目描述

给定三个正整数 a,b,c。

请计算 ⌊(a+b+c)/2⌋,即 a,b,c 相加的和除以 2 再下取整的结果。


输入格式

第一行包含整数 T,表示共有 T 组测试数据。

每组数据占一行,包含三个正整数 a,b,c。

输出格式

每组数据输出一行结果,表示答案。

数据范围

前三个测试点满足 1≤T≤10。
所有测试点满足 1≤T≤1000,1≤a,b,c≤1016


输入输出样例

输入:
4
1 3 4
1 10 100
10000000000000000 10000000000000000 10000000000000000
23 34 45
输出:
4
55
15000000000000000
51

解题思路

单纯依题意得。注:10的16次方,开个long long吧。


AC代码

#include <iostream>
using namespace std;

int n;
long long a, b, c, res;

int main() {
    scanf("%d", &n);
    while (n--) {
        scanf("%lld %lld %lld", &a, &b, &c);
        res = (a + b + c) / 2;
        printf("%lld\n", res);
    }
    return 0;
}

4498. 指针


4498. 指针

题目描述

给定一个如下图所示的全圆量角器。
在这里插入图片描述
初始时,量角器上的指针指向刻度 0。

现在,请你对指针进行 n 次拨动操作,每次操作给定一个拨动角度 ai,由你将指针拨动 ai 度,每次的拨动方向(顺时针或逆时针)由你自由决定。

请你判断,能否通过合理选择每次拨动的方向,使得指针最终仍然指向刻度 0。


输入格式

第一行包含整数 n。

接下来 n 行,每行包含一个整数 ai,表示一次操作的拨动角度。

输出格式

如果可以做到指针最终仍然指向刻度 0,则输出 YES,否则输出 NO。

数据范围

前 4 个测试点满足 1≤n≤3。
所有测试点满足 1≤n≤15,1≤ai≤180。


输入输出样例

示例1

输入:
3
10
20
30
输出:
YES

示例2

输入:
3
10
10
10
输出:
NO

示例3

输入:
3
120
120
120
输出:
YES

解题思路

典型深度优先搜索,遍历所有情况,遇到能行就输出YES,否则输出NO。


AC代码

#include <iostream>
using namespace std;
int n, a[15];
bool flag = false;

void dfs (int ds, int t) {
    if (t == n) {
        if (abs(ds) % 360 == 0) flag = true;
        return;
    }
    dfs (ds + a[t], t + 1);
    dfs (ds - a[t], t + 1);
}
int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; i++) scanf("%d", &a[i]);
    dfs (0, 0);
    if (flag) printf("YES");
    else printf("NO");
    return 0;
}

4499. 画圆


4499. 画圆

题目描述

在一个二维平面内,给定一个以 (x1,y1) 为圆心,半径为 R 的圆以及一个坐标为 (x2,y2) 的点。

请你在二维平面上画一个圆,要求:

1、平面中不存在点满足既在你画的圆上,又在给定的圆外。
2、给定的点不能在你画的圆内(可以在圆上)。
3、被给定圆覆盖且不被你画的圆覆盖的区域面积应尽可能小。

请输出你画的圆的圆心坐标以及半径。


输入格式

共一行,包含 5 个整数 R,x1,y1,x2,y2

输出格式

三个实数 xans,yans,r,其中 (xans,yans) 是你画的圆的圆心坐标,r 是你画的圆的半径。

答案不唯一时,输出任意合理答案均可。

结果保留六位小数。

数据范围

所有测试点满足 1≤R≤105,|x1|,|y1|,|x2|,|y2|≤105


输入输出样例

示例1

输入:
5 3 3 1 1
输出:
3.767767 3.767767 3.914214

示例2

输入:
10 5 5 5 15
输出:
5.000000 5.000000 10.000000

解题思路

貌似是几何题,要进行分类讨论。(看题解复现的代码。)


AC代码

#include <iostream>
#include <cmath>
using namespace std;
// 两点间距离公式,这里得到的是距离的平方
double distant(double x1, double y1, double x2, double y2) {
    return abs(x1 - x2) * abs(x1 - x2) + abs(y1 - y2) * abs(y1 - y2);
}

int main() {
    double r, x1, y1, x2, y2;
    scanf("%lf %lf %lf %lf %lf", &r, &x1, &y1, &x2, &y2);
    // 点过圆心
    if (x1 == x2 && y1 == y2) {
        printf("%.6f %.6f %.6f", x1 + r / 2, y1, r / 2);
        return 0;
    }
    // 点在圆外
    if (sqrt(distant(x1, y1, x2, y2)) >= r) { // 先开方再用来比较
        printf("%.6f %.6f %.6f", x1, y1, r);
        return 0;
    }
    // 点在圆内
    double in = sqrt(distant(x1, y1, x2, y2));
    double R = (in + r) / 2;
    double inmin = R - in;
    double x = x1 - x2, y = y1 - y2;
    x /= in;
    y /= in;
    x *= inmin;
    y *= inmin;
    x1 += x;
    y1 += y;
    printf("%.6f %.6f %.6f", x1, y1, R);
    return 0;
}

总结

第一题签到题,
第二题深搜,
第三题看了代码,复现了,还是感觉最后一种情况不太懂。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值