> 文档中心 > AtCoder Beginner Contest 246 ABC题

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_1y1​x_2x2​ y_2y2​x_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{akX,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;}

明天再见~~