AtCoder Beginner Contest 246 ABC题
目录
A
问题陈述
约束
输入
输出
示例输入 1 复制
示例输出 1 复制
示例输入 2 复制
示例输出 2 复制
B
问题陈述
约束
输入
输出
示例输入 1 复制
示例输出 1 复制
示例输入 2 复制
示例输出 2 复制
示例输入 3 复制
示例输出 3 复制
c
问题陈述
约束
输入
输出
示例输入 1 复制
示例输出 1 复制
示例输入 2 复制
示例输出 2 复制
示例输入 3 复制
示例输出 3 复制
A
A - 四点社论
/
时间限制: 2 秒 / 内存限制: 1024 MB
得分 : 积分100100
问题陈述
-平面中有一个矩形。此矩形的每个边都平行于 - 或 - 轴,并且其面积不为零。xyxyxxyy
给定此矩形的四个顶点中的三个的坐标, , 和 ,找到另一个顶点的坐标。(x_1, y_1)(x1,y1)(x_2, y_2)(x2,y2)(x_3, y_3)(x3,y3)
约束
- -100 \leq x_i, y_i \leq 100−100≤xi,yi≤100
- 唯一存在一个矩形,其中所有 , 作为顶点,平行于 - 或 - 轴的边以及非零区域。(x_1, y_1)(x1,y1)(x_2, y_2)(x2,y2)(x_3, y_3)(x3,y3)xxyy
- 输入中的所有值都是整数。
输入
输入从标准输入以下列格式提供:
x_1x1 y_1y1x_2x2 y_2y2x_3x3 y_3y3
输出
按以下格式打印由空格分隔的所查找坐标:(x, y)(x,y)
xx yy
示例输入 1 复制
复制
-1 -1-1 23 2
示例输出 1 复制
复制
3 -1
带顶点的矩形的另一个顶点是 。(-1, -1), (-1, 2), (3, 2)(−1,−1),(−1,2),(3,2)(3, -1)(3,−1)
示例输入 2 复制
复制
-60 -40-60 -80-20 -80
示例输出 2 复制
复制
-20 -40
我的笨蛋方法,说来惭愧,我是把所有的情况枚举了一遍哈哈哈
#includeusing namespace std;int main(){int x1,y1,x2,y2,x3,y3,x4,y4;cin>>x1>>y1;cin>>x2>>y2;cin>>x3>>y3;if(x1 == x2){if(y2 == y3){y4 = y1;x4 = x3;}else{x4 = x3;y4 = y2;}}else if(x1 == x3){if(y2 == y3){y4 = y1;x4 = x2;}else{x4 = x2;y4 = y3;}}else if(x2 == x3){if(y1 == y3){y4 = y2;x4 = x1;}else{x4 = x1;y4 = y3;}}cout<<x4<<" "<<y4<<endl;return 0;}
大佬的题解
#include using namespace std;int main(void){ int x_1, x_2, x_3, y_1, y_2, y_3, x_ans, y_ans; cin >> x_1 >> y_1; cin >> x_2 >> y_2; cin >> x_3 >> y_3; if(x_1 == x_2) x_ans = x_3; if(x_2 == x_3) x_ans = x_1; if(x_3 == x_1) x_ans = x_2; if(y_1 == y_2) y_ans = y_3; if(y_2 == y_3) y_ans = y_1; if(y_3 == y_1) y_ans = y_2; cout << x_ans << " " << y_ans << endl; return 0;}
别着急还有,我学长的题解yyds!!!!!把异或运用上去了,简直了
#includeusing namespace std;int main(){int x1,y1,x2,y2,x3,y3,x4,y4;cin>>x1>>y1;cin>>x2>>y2;cin>>x3>>y3;x4 = x1^x2^x3;y4 = y1^y2^y3;cout<<x4<<" "<<y4<<endl;return 0;}
B
B - 走近社论
/
时间限制: 2 秒 / 内存限制: 1024 MB
得分 : 积分200200
问题陈述
从二维平面中的点开始,让我们向该点移动距离。移动后找到我们的坐标。(0,0)(0,0)11(A, B)(A,B)
在这里,在将距离从一个点移动到一个点(段的长度)之后,我们位于段上的距离为 的点。
约束保证点和 点之间的距离至少为 。ddXXYYd \led≤XYXYXYXYXXdd(0, 0)(0,0)(A, B)(A,B)11约束
- 输入中的所有值都是整数。
- 0 \le A,B \le 10000≤A,B≤1000
- (A,B) \neq (0,0)(A,B)=(0,0)
输入
输入从标准输入以下列格式提供:
AA BB
输出
让我们成为我们搬家后的坐标。打印并按此顺序,用空格分隔。
当对于每个印刷值,法官的答案的绝对或相对误差最多为 时,您的输出被认为是正确的。(x, y)(x,y)xxyy10^{−6}10−6
示例输入 1 复制
复制
3 4
示例输出 1 复制
复制
0.600000000000 0.800000000000
例如,打印也将被接受。
0.5999999999 0.8000000001
示例输入 2 复制
复制
1 0
示例输出 2 复制
复制
1.000000000000 0.000000000000
我们可能会到达.(A, B)(A,B)
示例输入 3 复制
复制
246 402
示例输出 3 复制
复制
0.521964870245 0.852966983083
直接上题解
#includeusing namespace std;int main(){ int x,y; cin >> x >> y; int d2=x*x+y*y; double d=d2; d=sqrt(d); double dx=x,dy=y; cout << dx/d << ' ' << dy/d << '\n'; return 0;}
c
C - 优惠券社论
/
时间限制: 2 秒 / 内存限制: 1024 MB
得分 : 积分300300
问题陈述
商店里有商品。对于每个 ,第 -项的价格是日元(日本的货币)。NNi = 1, 2, \ldots, Ni=1,2,…,NiiA_iAi
高橋有优惠券。
每张优惠券可用于一件商品。您可以在同一商品上使用任意数量的优惠券,可能为零。在价格为日元的商品上使用优惠券可以让您以日元的价格购买。KKkkaa\max\lbrace a - kX, 0\rbracemax{a−kX,0}打印高桥购买所有物品所需的最低金额。
约束
- 1 \leq N \leq 2 \times 10^51≤N≤2×105
- 1 \leq K, X \leq 10^91≤K,X≤109
- 1 \leq A_i \leq 10^91≤Ai≤109
- 输入中的所有值都是整数。
输入
输入从标准输入以下列格式提供:
NN KK XXA_1A1 A_2A2 \ldots… A_NAN
输出
打印答案。
示例输入 1 复制
复制
5 4 78 3 10 5 13
示例输出 1 复制
复制
12
通过在 -st 项目上使用优惠券,在 -rd 项目上使用优惠券,在 -th 项目上使用优惠券,Takahashi 可以:111111332255
- 用日元购买-st项目,11\max\lbrace A_1-X, 0 \rbrace = 1max{A1−X,0}=1
- 以日元的价格购买-nd项目,22\max\lbrace A_2, 0 \rbrace = 3max{A2,0}=3
- 以日元的价格购买-rd项目,33\max\lbrace A_3-X, 0 \rbrace = 3max{A3−X,0}=3
- 以日元的价格购买第-件商品,44\max\lbrace A_4, 0 \rbrace = 5max{A4,0}=5
- 以日元的价格购买第-件商品,55\max\lbrace A_5-2X, 0 \rbrace = 0max{A5−2X,0}=0
总共日元,这是最低可能的价格。1 + 3 + 3 + 5 + 0 = 121+3+3+5+0=12
示例输入 2 复制
复制
5 100 78 3 10 5 13
示例输出 2 复制
复制
0
示例输入 3 复制
复制
20 815 602066 3193 2325 4030 3725 1669 1969 763 1653 159 5311 5341 4671 2374 4513 285 810 742 2981 202
示例输出 3 复制
复制
112
这一题比赛的时候用暴力写的哈哈,然鹅。。。不太行
我的暴力方法
#include#include#includeusing namespace std;const int N = 1e6;typedef long long LL;LL n,k,x;int a[N];int main(){cin.tie(0);ios::sync_with_stdio(0);cin>>n>>k>>x;LL i,j;for(i = 0;i>a[i];}for(i = 0;i=x&&k>0){a[i] -=x;k--;}}if(k>0){sort(a,a+n);for(j = n-1;j>n-1-k;j--){a[j]-=x;if(a[j]<0){a[j] = 0;}}}LL s = 0;for(i = 0;i<n;i++){s+=a[i];}cout<<s;return 0;}
结果就是
暴力不行,时间复杂度太高,放弃
来看题解
#include #include using namespace std;typedef long long ll;ll n, k, x;ll a[200005];int main(void){ cin >> n >> k >> x; for(int i = 1; i > a[i]; ll ans = 0; for(int i = 1; i <= n; i++) ans += a[i]; ll m = 0; for(int i = 1; i <= n; i++) m += a[i]/x; m = min(m, k); ans -= m*x, k -= m; for(int i = 1; i = 1; i--){ if(k == 0) break; ans -= a[i], k--; } cout << ans << endl; return 0;}
明天再见~~