A.Stickogon(贪心)
题意:
给你 n n n个长度为 a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1,a2,…,an的木棒。求你能同时拼出的正多边形(等边)的最大数量,使得:
- 多边形的每条边都正好由一根木棒组成。
- 多边形中使用的小棒不超过 1 1 1根。
注意:木棒不能折断。
分析:
本题我们贪心地考虑,尽可能找 3 3 3个长度一样的棍子凑成一个正多边形,然后统计个数。
代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
map<int, int> mp;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
mp[x]++;
}
int ans = 0;
for (auto s: mp) {
ans += s.second / 3;
}
cout << ans << endl;
}
return 0;
}
B.A BIT of a Construction(构造)
题意:
给定整数 n n n和 k k k,构造一个由 n n n个非负整数(即 ≥ 0 \geq 0 ≥0)组成的序列 a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1,a2,…,an,使得
- ∑ i = 1 n a i = k \sum\limits_{i=1}^n a_i=k i=1∑nai=k
- 使 a 1 ∣ a 2 ∣ … ∣ a n a_1 | a_2 | \ldots | a_n a1∣a2∣…∣an的二进制表示中 1 1 1的个数最大。
分析:
要求或运算 1 1 1的个数最大,显然最优的就是有最低到最高位都摆成连续的 1 1