A.Alice and Books(思维)
题意:
爱丽丝有 n n n本书。第 1 1 1本书包含 a 1 a_1 a1页,第 2 2 2本书包含 a 2 a_2 a2页, … \ldots …第 n n n本书包含 a n a_n an页。爱丽丝的操作如下:
- 她把所有的书分成两个非空的书堆。这样,每本书最后都会被恰好放在两堆书中的一堆里。
- 爱丽丝阅读每一堆中编号最高的一本书。
爱丽丝非常喜欢阅读。帮她找出把书分成两堆后,她最多可以阅读的总页数。
分析:
观察题目很容易看出来,最后一个数字是必须取的,用前 n − 1 n-1 n−1个数字的最大值加上最后一个值求和即可。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int a[N];
void solve() {
int n;
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
}
int ans = a[n];
int ans2 = 0;
for (int i = 1; i < n; ++i) {
ans2 = max(ans2, a[i]);
}
cout << ans + ans2 << endl;
}
int main() {
int t;
cin >> t;
while (t--)
solve();
return 0;
}
B.New Bakery(数学)
题意:
鲍勃决定开一家馒头店。开业当天,他烤出了 n n n个可以出售的馒头。通常一个馒头的价格是 a a a个硬币,但为了吸引顾客,鲍勃组织了以下促销活动:
- 鲍勃选择某个整数 k k k( 0 ≤ k ≤ min ( n , b ) 0\le k\le\min(n,b) 0≤k≤min(n,b))。
- 鲍勃以修改后的价格出售第一批 k k k个馒头。在这种情况下,售出的 i i i( 1 ≤ i ≤ k 1\le i\le k 1≤i≤k)个馒头的价格是 ( b − i + 1 ) (b-i+1) (b−i+1)个硬币。
- 剩下的 ( n − k ) (n-k) (n−k)个馒头以每个 a a a个硬币的价格出售。
注意 k k k可以等于 0 0 0。在这种情况下,鲍勃将以每个 a a a硬币的价格出售所有的馒头。
帮助鲍勃确定出售所有 n n n个馒头所能获得的最大利润。
分析:
首先当 a ≥ b a≥b a≥b时, k k k取 0 0 0即可。
当 a < b a\lt b a<b时,要想使利润尽可能大,必须满足前 k k k天的利润都比 a a a大,即要满足 b − k ≥ a b−k≥a b−k≥a。可以得出 k k k最大为 b − a b−a b−a,然后计算即可。
注意 k k k需要满足不超过 m i n ( n , b ) min(n,b) min(n,b)的限制,所以最终 k = m i n ( n , b − a ) k=min(n,b−a) k=min(n,b−a),答案为 ( b + b − k + 1 ) k 2 + ( n − k ) a \frac{(b+b−k+1)k}{2}+(n−k)a 2(b+b−k+1)k+(n−k)a。
代码:
#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
void solve() {
LL n, a, b;
cin >> n >> a >> b;
if (a >= b) {
cout << n * a << endl;
return;
}
LL k = min(n, b - a);
cout << (b + b - k + 1) * k / 2 + a * (n - k) << endl;
}
int main() {
int t;
cin >> t;
while (t--)
solve();
return 0;
}
C.Manhattan Permutations(构造)
题意:
让我们把排列 † ^{\dagger} †的曼哈顿值 p p p表示为 ∣ p 1 − 1 ∣ + ∣ p 2 − 2 ∣ + … + ∣ p n − n ∣ |p_1-1|+|p_2-2|+\ldots+|p_n-n| ∣p1−1∣+∣p2−2∣+…+∣pn−n∣的值。
例如,对于排列 [ 1 , 2 , 3 ] [1,2,3] [1,2,3],曼哈顿值为 ∣ 1 − 1 ∣ + ∣ 2 − 2 ∣ + ∣ 3 − 3 ∣ = 0 |1-1|+|2-2|+|3-3|=0 ∣1−1∣+∣2−2∣+