競賽鏈接
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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/500314.html
標籤:其他
