注意: \color{red}{注意:} 注意: 个人博客传送门
A. 美丽的2024
思路:
- 直接运用
__builtin_popcount()
这个库函数可以直接得到一个十进制数转2
进制中1
的个数
时间复杂度: O ( l o g n ) O(logn) O(logn)
signed main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout << __builtin_popcount(2024) << "\n";
return 0;
}
B. 自助餐
思路:
- 打表即可
时间复杂度: O ( n ) O(n) O(n)
signed main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::unordered_map<std::string, int> h{{"yuanxing", 1}, {"zhengfangxing", 2},
{"changfangxing", 3}, {"sanjiaoxing", 4}, {"tuoyuanxing", 5}, {"liubianxing", 6}};
int n;
std::cin >> n;
int ans = 0;
for (int i = 0; i < n; i++) {
std::string s;
std::cin >> s;
if (h.count(s)) {
ans += h[s];
}
}
std::cout << ans << "\n";
return 0;
}
C. 玩游戏
思路:
A
的必胜态为石子个数为奇数的情况B
的必胜态为石子个数为偶数的情况- 无论怎么分,只要石子的个数为奇数,那么
A
一定可以拿到最后一个,反之,偶数的情况,B
一定可以拿最后一个
时间复杂度: O ( 1 ) O(1) O(1)
signed main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n;
std::cin >> n;
if (n & 1) {
std::cout << "A\n";
} else {
std::cout << "B\n";
}
return 0;
}
D. 乘飞机
思路:
- 只要在
[l, r]
这个区间中,那么一定最多只会出现100
个数相差大于365
,只要这100
个数以外的其他数,一定是满足条件的 - 所以暴力枚举即可
def check(ages, l, r):
# 对给定区间内的年龄进行排序
sorted_ages = sorted(ages[l-1:min(r, l + 100)])
left = 0
right = 1
while right < len(sorted_ages):
if abs(sorted_ages[right] - sorted_ages[left]) <= 365:
return "YES"
left += 1
right += 1
if r > l + 100:
return "YES"
else:
return "NO"
n, q = map(int, input().split())
ages = list(map(int, input().split()))
for _ in range(q):
l, r = map(int, input().split())
print(check(ages, l, r))