目录
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 2 3 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
我的笨蛋方法,说来惭愧,我是把所有的情况枚举了一遍哈哈哈
#include<iostream>
using 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 <iostream>
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!!!!!把异或运用上去了,简直了
#include<iostream>
using 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
直接上题解
#include<bits/stdc++.h>
using 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 XX A_1A1 A_2A2 \ldots… A_NAN
输出
打印答案。
示例输入 1 复制
复制5 4 7 8 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 7 8 3 10 5 13
示例输出 2 复制
复制0
示例输入 3 复制
复制20 815 60 2066 3193 2325 4030 3725 1669 1969 763 1653 159 5311 5341 4671 2374 4513 285 810 742 2981 202
示例输出 3 复制
复制112
这一题比赛的时候用暴力写的哈哈,然鹅。。。不太行
我的暴力方法
#include<iostream>
#include<algorithm>
#include<cstdio>
using 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<n;i++){
cin>>a[i];
}
for(i = 0;i<n;i++){
while(a[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 <iostream>
#include <algorithm>
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 <= n; i++) cin >> 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 <= n; i++) a[i] %= x;
sort(a+1, a+n+1);
for(int i = n; i >= 1; i--){
if(k == 0) break;
ans -= a[i], k--;
}
cout << ans << endl;
return 0;
}
明天再见~~