【招商银行2020FinTech研发赛道】写了一个简易的题解
自己写了一个简易的题解,不知道是不是正解,大家可以一起来讨论😉
A 金币
经典的数塔问题,自底向上走,可以避免边界条件处理,且结果容易得到
#include <bits/stdc++.h>
using namespace std;
int mmap[1030][1030], dp[1030][1030];
int main()
{
int n;
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= i; ++j)
scanf("%d", &mmap[i][j]);
for(int i = 1; i <= n; ++i)
dp[n][i] = mmap[n][i];
for(int i = n - 1; i >= 1; --i)
for(int j = 1; j <= i; ++j)
dp[i][j] = max(dp[i+1][j], dp[i+1][j+1]) + mmap[i][j];
printf("%d\n", dp[1][1]);
return 0;
}
B 交换座位
遍历,每次处理一对,如果不符合要求就需要进行交换,可以开一个值到下标的映射数组mmap来找到需要的值的位置,维护数组row和mmap即可
#include <bits/stdc++.h>
using namespace std;
int mmap[1030][1030], dp[1030][1030];
int main()
{
int n;
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= i; ++j)
scanf("%d", &mmap[i][j]);
for(int i = 1; i <= n; ++i)
dp[n][i] = mmap[n][i];
for(int i = n - 1; i >= 1; --i)
for(int j = 1; j <= i; ++j)
dp[i][j] = max(dp[i+1][j], dp[i+1][j+1]) + mmap[i][j];
printf("%d\n", dp[1][1]);
return 0;
} C 修塔游戏
- 由于要操作最高和最低,首先进行排序
- k个相同的数必然出现在原数组中,那么可以枚举每一个数
- 对于每一个数要操作后变成k个数,可以只操作左边,只操作右边,或者两边都进行操作,操作次数可以用前缀和简化计算得到,三种情况取最小即可
- 注意到由于每次只能操作最高和最低的塔,可以观察到对于每一个数,操作完成后数组中的元素都会达到相等状态且都比目标值小1,比如 1 2 3 5,对于5,可以如下操作:1 2 3 5 -> 2 2 3 5 -> 2 3 3 5 -> 3 3 3 5 -> 3 3 4 5 -> 3 4 4 5 -> 4 4 4 5,这样如果最终相等的数多于k个,就需要减去多余的元素个数
- 此外,还可以针对已经有k个相同的数进行特判
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll a[200005], presum[200005], cnt[10005];
int main()
{
ll n, k;
scanf("%lld %lld", &n, &k);
for(int i = 1; i <= n; ++i)
{
scanf("%lld", &a[i]);
++cnt[a[i]];
if(cnt[a[i]] >= k)
{
printf("0\n");
return 0;
}
}
sort(a + 1, a + 1 + n);
for(int i = 1; i <= n; ++i)
presum[i] = presum[i-1] + a[i];
ll ans = 0x3f3f3f3f3f3f3f3f;
for(int i = 1; i <= n; ++i)
{
// 左边
if(i >= k)
ans = min(ans, i * a[i] - presum[i] - (i - k));
// 右边
if(n - i + 1 >= k)
ans = min(ans, (presum[n] - presum[i-1]) - (n - i + 1) * a[i] - (n - i + 1 - k));
// 两边一起
ans = min(ans, i * a[i] - presum[i] + (presum[n] - presum[i-1]) - (n - i + 1) * a[i] - (n - k));
}
printf("%lld\n", ans);
return 0;
} 