应该是对的,欢迎探讨
第一题,判断四个点能不能构成一个正方形
输入的第一行是n,代表有多少组点
然后是三组输入,每组的第一行是横坐标,第二行是纵坐标
输入
3
0 0 2 2
0 2 0 2
0 5 1 6
1 0 6 5
0 0 7 7
0 3 0 3
输出
YES
YES
NO

思路:计算任意两点间的距离,共有六组,排序后,前四个应该是边长,后两个就是对角线的长
如果有前四个边相等,后两条对角线相等,且对角线大于边长,就是正方形

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<vector>
using namespace std;
class Solution {
public:
int lengthl(int x1, int y1, int x2, int y2) {
return sqrt((y2 - y1)*(y2 - y1) + (x2 - x1)*(x2 - x1));
}
void isSquare(const vector<int>& x, const vector<int>& y) {
vector<int> tmpLength;
int flag = 0;
for (int i = 0; i < 4; i++) {
for (int j = i + 1; j < 4; j++) {
tmpLength.push_back(lengthl(x[i], y[i], x[j], y[j]));
}
}
sort(tmpLength.begin(), tmpLength.end());
if (tmpLength[0] == tmpLength[1]==tmpLength[2] && tmpLength[4] == tmpLength[5] && tmpLength[4] > tmpLength[0]) {
cout << "Yes" << endl;
}
else {
cout << "No" << endl;
}
}
};
int main() {
int n;
while (cin >> n) {
vector<int> x;
vector<int> y;
for (int i = 0; i < 4; i++) {
int tmp;
cin >> tmp;
x.push_back(tmp);
}
for (int i = 0; i < 4; i++) {
int tmp;
cin >> tmp;
y.push_back(tmp);
}
Solution s;
s.isSquare(x, y);
return 0;
}
}

第二题
说小Q有2的N次方面值的钱各两个,如有1,1,2,2,4,4,8,8,…
现在给出一个数n,问小Q的钱有多少种组合方式能组成n
样例:
输入10
输出5

这个题没做出来,在网上找到大神的代码,给大家参考,大家可以自行到下面链接去看
https://blog.csdn.net/uncle_gy/article/details/77977436

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include<iostream>
#include<set>
using namespace std;

int main()
{
int n;
cin>>n;
set<int> countset;
for (int i = 1; i <= n / 2; i++) {
int result = i ^ (n - i);
countset.insert(result);
}
cout << countset.size() << endl;
return 0;
}