其他分享
首页 > 其他分享> > 【AcWing】第61场周赛【2022.07.23】

【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.指针

题目链接

链接

题目描述

给定一个如下图所示的全圆量角器。

image

初始时,量角器上的指针指向刻度 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