A
题意:
给你一个矩形的三个坐标,求出第四个坐标。
题解:
矩形的坐标有这样一个性质,每个数字都会出现两次,因为我们已经知道了3个坐标,那么我们只要统计这三个坐标出现的数字然后对x坐标只出现了一次的就是答案,对于y同理。
代码:
#include<iostream>
#include<vector>
#include<map>
#include<math.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 2 * 1e5 + 10, inf = 1e9, mod = 998244353;
int n;
int u, v;
map<int, int> x, y;
void solve()
{
for (int i = 0; i < 3; i++)
{
cin >> u >> v;
x[u]++; y[v]++;
}
for (const auto& i : x)
if (i.second < 2)
cout << i.first<<' ';
for (const auto& j : y)
if (j.second < 2)
cout << j.first;
}
int main()
{
int t = 1;
//cin >> t;
while (t--)
{
solve();
}
return 0;
}
B
题意:
给你一个坐标(A,B),从(0,0)向(A,B) 方向移动距离一,求移动后位置的坐标。
题解:
我们可以利用相似三角形求解,我们先求出如果要到(A,B)我们需要走多少距离。
由相似三角形可知:
代码:
#include<iostream>
#include<vector>
#include<map>
#include<math.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 2 * 1e5 + 10, inf = 1e9, mod = 998244353;
int n;
double a, b, x, y;
double k;
void solve()
{
cin >> a >> b;
k = sqrt(a * a + b * b);
printf("%.6lf %.6lf", a / k, b / k);
}
int main()
{
int t = 1;
//cin >> t;
while (t--)
{
solve();
}
return 0;
}
C
题意:
商店里有n件商品,每件ai元,有k张优惠劵,每张可以减x元,同一个商品可以减多次最低减到0元。
题解:
对数组a进行排序,从最大的开始减,只要ai大于x就用优惠劵,知道ai<x或者k<=0为止。
在遍历完数组后,如果优惠券还没用完,那就再对数组a排序,从最大的开始,把ai变为0,知道ai遍历完或者k<=0时结束。
最后把a数组a的所有值相加求和即可。
代码:
#include<iostream>
#include<vector>
#include<map>
#include<math.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 2 * 1e5 + 10, inf = 1e9, mod = 998244353;
int n;
int k, x, a[N];
ll sum;
void solve()
{
cin >> n >> k >> x;
for (int i = 1; i <= n; i++)
cin >> a[i];
sort(a + 1, a + n + 1);
for (int i = n; i >= 1; i--)
{
while (a[i] >= x && k > 0)
{
a[i] -= x;
k--;
}
if (k <= 0)
break;
}
sort(a + 1, a + n + 1);
int sign = n;
while (k > 0 && sign > 0)
{
a[sign--] = 0;
k--;
}
for (int i = 1; i <= n; i++)
sum += a[i] * 1ll;
cout << sum;
}
int main()
{
int t = 1;
//cin >> t;
while (t--)
{
solve();
}
return 0;
}