点这里
A A Xor B problrm
两个数异或为零,意思就是两个数相等,可以说自己和自己也是一个数对 如果是两层循环会超时,所以开个数组来计算每个数出现的次数,个数的平方就是这个数可以构成的数对,最后加一起就可以了。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1000010;
ll cnt[N];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++){
int x;
cin >> x;
cnt[x]++;
}
ll sum = 0;
for (int i = 0; i < N; i++)sum += cnt[i] * cnt[i];
cout << sum << endl;
return 0;
}
B 吃苹果
每天吃一个苹果,选择白天或晚上吃会获得不一样的价值,但必须k填在晚上吃,那我们就必须选择晚上价值相对较高,也就是和白天的价值相差较大的苹果,如果不这样的话,很有可能把白天价值和晚上价值都很高的苹果吃了,就不是最优解了,晚上的价值就是相对价值较大的,白天价值大的就是相对价值较小的,一相对价值排序,然后加起来就可以了。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 100010;
struct S{
int da,ni,sum;
}a[N];
bool cmp(S a,S b){
return a.sum>b.sum;
}
int main() {
int n, k;
cin >> n >> k;
for (int i = 0; i < n; i++) {
cin >> a[i].da >> a[i].ni;
a[i].sum = a[i].ni - a[i].da;
}
sort(a, a + n, cmp);
int ans = 0;
for (int i = 0; i < k; i++)ans += a[i].ni;
int cnt = 0;
for (int i = n - 1;; i--) {
ans += a[i].da, cnt++;
if (cnt == n - k)break;
}
cout << ans << endl;
return 0;
}
C n皇后
这题可以用四个数组来存储每个位置所在行,列,两条对角线,0表示没有皇后,1表示有,注意,这题数据范围超i过一百万,用scanf和printf来输入输出,cin和cout会超时,血的教训,或者关闭同步也可以。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1000010;
int h[N], l[N], d[N], nd[N];
int main() {
int n, T;
cin >> n >> T;
while (T--) {
int x, y;
cin >> x >> y;
if (!h[x] && !l[y] && !d[y - x + N] && !nd[y + x + N]) {
cout << "Yes" << endl;
h[x] = l[y] = 1;
d[y - x] = nd[y + x] = 1;
} else cout << "No" << endl;
}
return 0;
}
D 苹果
题意就是一个坐标系内,有一些苹果,并且用两条直线把他们分成四部分,统计有多少苹果,不存在在直线上的苹果。就是简单的判断判断一下在两条线的上下方即可 也就是判断直线方程的值大于,并用数组记录,最后排序即可。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#define ll long long
using namespace std;
const int N=100010;
int n;
int a, b, c, d, e, f;
int cnt[N];
int main() {
cin >> n;
cin >> a >> b >> c >> d >> e >> f;
while (n--) {
int x, y;
cin >> x >> y;
ll res1 = a * x + b * y + c;
ll res2 = d * x + e * y + f;
if (res1 > 0 && res2 > 0)cnt[1]++;
else if (res1 > 0 && res2 < 0)cnt[2]++;
else if (res1 < 0 && res2 > 0)cnt[3]++;
else if (res1 < 0 && res2 < 0)cnt[4]++;
}
sort(cnt + 1, cnt + 5);
for (int i = 1; i <= 4; i++)cout << cnt[i] << ' ';
return 0;
}