文章目录
前言
经典忘记做,后来才来做的。
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. 指针
题目描述
给定一个如下图所示的全圆量角器。
初始时,量角器上的指针指向刻度 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. 画圆
题目描述
在一个二维平面内,给定一个以 (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;
}
总结
第一题签到题,
第二题深搜,
第三题看了代码,复现了,还是感觉最后一种情况不太懂。