由于周日团建所以🕊了,今天补上。
Friends and the Restaurant
题目大意:
两两个一组,组中所有xi值的总和不得超过组中yi值的总和。
朋友可以光顾餐厅的最大天数是多少?
思路:既然是xi值总和不超过yi值总和,那么就直接把yi-xi的差值存起来,只需要找到一对(i,j)满足[(yi-xi)+(yj-xj)]>=0就行了,所以选择对所有yi-xi存起来,排序双指针。
AC代码:
#include <bits/stdc++.h>
void solve() {
int n;
std::cin >> n;
std::vector<int>a(n), b(n), c(n);
for (int i = 0; i < n; i++) {
std::cin >> a[i];
}
for (int i = 0; i < n; i++) {
std::cin >> b[i];
c[i] = b[i] - a[i];
}
std::sort(c.begin(), c.end());
int l = 0, r = n - 1, ans = 0;
while (l < r) {
if (c[l] + c[r] >= 0) {
ans++, l++, r--;
} else {
l++;
}
}
std::cout << ans << "\n";
}
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
int t;
std::cin >> t;
while (t--) {
solve();
}
return 0;
}
另外补一下周赛的一道题,虽然做对了,但是又要复盘一下思路。
七便士
思路:根据题意
那我们就把变建出来:
int g[8][8];
for (int i = 1; i <= 8; i++) {
g[i][(i + 2) % 8 + 1] = g[i][(i + 4) % 8 + 1] = 1;
}
for (int i = 1; i <= 8; i++) {
for (int j = 1; j <= 8; j++) {
std::cout << g[i][j];
}
std::cout << "\n";
}
如此跑出来:
00010100
00001010
00000101
10000010
01000001
10100000
01010000
00101001
跑出来大概就是这个样子,忽略最后一个这就是建边情况。
那么我们可以画出以下图:
图比较简陋凑合看吧/(ㄒoㄒ)/~~
那么我们就可以两两找边,有边且都是0那就++,最后判断是否有7个便士即可
AC代码如下:
#include <bits/stdc++.h>
int a[] = {0, 1, 4, 7, 2, 5, 8, 3, 6};
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
int t;
std::cin >> t;
while (t--) {
char s[100];
int cnt = 0;
for (int i = 1; i <= 8; i++) {
std::cin >> s[i];
if (s[i] == '1') cnt++;
}
if (s[a[1]] == '0' && s[a[8]] == '0') cnt++;
for (int i = 1; i < 8; i++) {
if (s[a[i]] == '0' && s[a[i + 1]] == '0') cnt++;
}
if (cnt >= 7) {
std::cout << "Yes\n";
} else std::cout << "No\n";
}
return 0;
}