A.Sasha and the Beautiful Array(递推)
题意:
萨沙决定送给女友一个数组 a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1,a2,…,an。他发现女友会将数组的美丽度评估为所有从 2 2 2到 n n n的整数 i i i的 ( a i − a i − 1 ) (a_i−a_{i−1}) (ai−ai−1)之和。
如果可以重新排列其元素,请帮助他计算数组 a a a的最大美丽度是多少。
分析:
递推可以发现最后的结果为最后一个元素减第一个元素,将其分别取最大和最小,此时的美丽度就是最大值。
代码:
#include<bits/stdc++.h>
using namespace std;
int a[105];
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
sort(a, a + n);
cout << a[n - 1] - a[0] << endl;
}
return 0;
}
B.Sasha and the Drawing(模拟)
题意:
在幼儿园时,萨沙就喜欢上了一个女孩。他想给她画一幅画,吸引她的注意。
他决定画一个大小为 n × n n\times n n×n的正方形网格,在网格中给一些单元格涂上颜色。但是给单元格上色很困难,所以他想给尽可能少的单元格上色。但与此同时,他希望至少 k k k条对角线上至少有一个着色的单元格。大小为 n × n n\times n n×n的正方形网格共有 4 n − 2 4n-2 4n−2条对角线。
计算他需要涂色的最小单元格数。
分析:
模拟一下发现前几次操作可以使答案增加 2 2 2,但是在到达一定的数量后每次只能让答案增加 1 1 1。考虑如何计算出最少涂多少个能把贡献为 2 2 2的格子涂完。画几个图手推一下发现最优方案是先填满第一列,再从最后一列第二行填到倒数第二行,这样前 2 × ( n − 1 ) 2\times(n-1) 2×(n−1)次的贡献都是 2 2 2。
代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int n, k;
cin >> n >> k;
if (k <= (n + n - 2) * 2) {
cout << (k + 1) / 2 << endl;
continue;
}
int ans = 2 * n - 2;
k -= ans * 2;
cout << ans + k << endl;
}
return 0;
}
C.Sasha and the Casino(递推)
题意:
萨沙决定送给女朋友一个最好的手提包,但不幸的是,这个手提包非常昂贵。因此,萨沙想赚点钱。在网上查看了赚钱技巧后,他决定去赌场。
萨沙知道赌场的运作规则如下。如果萨沙下注 y y y个硬币(其中 y y y为正整数),如果他赢了,他将获得 y ⋅ k y\cdot k y⋅k个硬币(即他的硬币数量将增加 y ⋅ ( k − 1 ) y\cdot(k-1) y⋅(k−1))。如果输了,他将输掉全部赌注(即他的硬币数量将减少 y y y)。
注意,投注金额必须始终是一个正整数,并且不能超过萨沙当前的硬币数量。
萨沙还知道赌场有一个保底活动:他不会连续输超过 x x x次。
最初,萨沙有 a a a枚硬币。他想知道自己是否可以下注保证赢取任意数量的硬币。换句话说,对于任意整数 n n n,萨沙可以进行下注,以便在不违反上述规则的情况下,在某一时刻至少拥有n个硬币。
分析:
本题类似倍投法,在一赔一的情况下,第一次压一块钱,每输一次就押注上一次两倍的金额。假如本金无限的话,这种方法赢的期望为无穷大。因为无论输多少次,赢一次本金就增加了 1 1 1。
考虑到最坏情况,即第 x + 1 x+1 x+1次才获胜。如果第 x + 1 x+1 x+1次赚钱了,并且投进去的总金额小于等于自己拥有的本金,然后再进行无限多次即可赢取任意数量的钱。所以只需要判断连续输 x x x次是否会输光本金即可。
代码:
#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int k, x, a;
cin >> k >> x >> a;
LL sum = 0;
bool flag = true;
for (int i = 1; i <= x + 1; i++) {
LL tmp = (sum + 1 + k - 2) / (k - 1);
sum += tmp;
if (sum > a) {
flag = false;
break;
}
}
if (flag) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}
D.Sasha and a Walk in the City(动态规划)
题意:
萨沙想和他的女朋友在城市里散步。城市由 n n n个路口组成,编号从 1 1 1到 n n