【AcWing】第61场周赛【2022.07.23】
作者:互联网
竞赛链接
A.糖果
题目链接
题目描述
给定三个正整数 a,b,c。
请计算 ⌊a+b+c2⌋,即 a,b,c 相加的和除以 2 再下取整的结果。
输入格式
第一行包含整数 T
,表示共有 T
组测试数据。
每组数据占一行,包含三个正整数 a,b,c
。
输出格式
每组数据输出一行结果,表示答案。
数据范围
前三个测试点满足 1 ≤ T ≤ 10
。
所有测试点满足 1 ≤ T ≤ 1000,1 ≤ a,b,c ≤ 10^16
。
输入样例:
4
1 3 4
1 10 100
10000000000000000 10000000000000000 10000000000000000
23 34 45
输出样例:
4
55
15000000000000000
51
难度:简单
时/空限制:1s / 256MB
总通过数:1217
总尝试数:1677
来源:AcWing,第61场周赛
思路
模拟,水题
代码
点击查看代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
void solve()
{
ll a , b , c;
cin >> a >> b >> c;
cout << (a+b+c)/2 << endl;
}
int main()
{
int T;
cin >> T;
while(T --)
solve();
return 0;
}
B.指针
题目链接
题目描述
给定一个如下图所示的全圆量角器。
初始时,量角器上的指针指向刻度 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
输出样例1:
YES
输入样例2:
3
10
10
10
输出样例2:
NO
输入样例3:
3
120
120
120
输出样例3:
``YES```
难度:中等
时/空限制:1s / 256MB
总通过数:960
总尝试数:2549
来源:AcWing,第61场周赛
思路
对于每一个a[i]来说都有两种选择,向左转,或者向右转,因此用dfs
代码
点击查看代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 20;
int n;
int a[N];
bool flag = false;
void dfs(int u,int d)//u:次数,d:度数
{
if(d % 360 == 0 && u == n)
{
flag = true;
return;
}
if(u == n)
return;
dfs(u+1,d+a[u]);
dfs(u+1,d-a[u]);
}
int main()
{
cin >> n;
for(int i = 0;i < n;i ++)
cin >> a[i];
dfs(0,0);
if(flag)
cout << "YES" << endl;
else
cout << "NO" << endl;
return 0;
}
C.画圆
题目链接
题目描述
在一个二维平面内,给定一个以 (x1,y1) 为圆心,半径为 R 的圆以及一个坐标为 (x2,y2) 的点。
请你在二维平面上画一个圆,要求:
1. 平面中不存在点满足既在你画的圆上,又在给定的圆外。
2. 给定的点不能在你画的圆内(可以在圆上)。
3. 被给定圆覆盖且不被你画的圆覆盖的区域面积应尽可能小。
请输出你画的圆的圆心坐标以及半径。
输入格式
共一行,包含 5 个整数 R,x1,y1,x2,y2。
输出格式
三个实数 xans,yans,r,
其中 (xans,yans)
是你画的圆的圆心坐标,r
是你画的圆的半径。
结果保留六位小数。
数据范围
所有测试点满足 1 ≤ R ≤ 10^5,|x1|,|y1|,|x2|,|y2| ≤ 10^5。
输入样例1:
5 3 3 1 1
输出样例1:
3.767767 3.767767 3.914214
输入样例2:
10 5 5 5 15
输出样例2:
5.000000 5.000000 10.000000
难度:困难
时/空限制 :1s / 256MB
总通过数:708
总尝试数:3450
来源:AcWing,第61场周赛
算法标签
计算几何
思路
根据第二个点的位置,可以分为两种情况
1.第二个点在圆外或圆上
那么最大的圆的位置就是已知圆本身
2.第二个点在圆内
在此情况上,又分为两种情况
- 输入的第二个点与第一个点//重叠**,则最大圆如图所示
- 输入的第二点与第一个点不重叠,则最大的圆如图所示
代码
点击查看代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const double eps = 1e-8;
//浮点数有误差,因此采用cmp函数
int cmp(double a,double b)
{
if(fabs(a - b) < eps) return 0;//a == b
if(a < b) return -1;//a < b
return 1;// a > b
}
int main()
{
double x1,y1,x2,y2,r;
scanf("%lf%lf%lf%lf%lf", &r , &x1 , &y1 , &x2 , &y2 );
//两点之间的距离
double dx = x1 - x2;
double dy = y1 - y2;
double d = sqrt(dx*dx + dy*dy);
//所给的点在圆上或圆外,因此最大的圆就是他本身
if(cmp(d,r) >= 0)
printf("%lf %lf %lf\n" , x1 , y1 , r);
else
{
if(cmp(x1,x2) == 0 && cmp(y1,y2) == 0)//给的两个点重合
printf("%lf %lf %lf\n", x1 + r/2 , y1 , r/2);
else
{
double r2 = ( r + d ) / 2;
double x = x2 + (x1 - x2) / d * r2;
double y = y2 + (y1 - y2) / d * r2;
printf("%lf %lf %lf\n" , x , y , r2);
}
}
return 0;
}
标签:lf,x1,y1,23,double,样例,61,2022.07,include 来源: https://www.cnblogs.com/heystar/p/16513139.html