情况

时间:2024年7月17日12:50-14:50
image.png

题解

A

思路

数学

代码

1
2
3
4
5
6
void solve()
{
int n, k;
cin >> n >> k;
cout << (n - 1) * k + 1 << endl;
}

B

题意

您将获得一个长度为 n 的整数数组 a
您可以应用以下操作任意次数(可能为零):

  • 首先,选择一个整数 k ,使得 1≤k≤n 并支付 k+1 硬币。
  • 然后,精确地选择 k 索引,使得 1≤i1<i2<…<ik≤n 。
  • 然后,对于从 1 到 k 的每个 x ,将 aix增加 1 。

求出使 a 不递减所需的最小硬币数

思路

贪心,找出要加的,和顺序没啥关系。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void solve()
{
int n;
vector<int> a;
vector<int> b;
cin >> n;
int x;
cin >> x;
a.push_back(x);
int max = x;
int temp = 0;
for (int i = 1; i < n; i++)
{
int x;
cin >> x;
a.push_back(x);
if (a[i] < max)
{
int cha = max - a[i];
b.push_back(cha);
}
else
{
max = a[i];
}
}
// 344 12 37 60 311 613 365 328 675
// 1 2 3
// 332 248 37
// 37*4 + 211*3 + 84 * 2 错
sort(b.begin(), b.end());
LL ans = 0;
LL sunhao = 0;
for (int i = 0; i < b.size(); i++)
{
if (b[i] - sunhao > 0)
{
ans += (b.size() - i + 1) * (b[i] - sunhao);
sunhao = b[i];
}
}
cout << ans << endl;
}

C

题意

一行中有 n朵花,其中第 i𝑖 朵最初具有 hi 米的正高度。
每隔一秒,风就会从左边吹来,导致一些花的高度降低。
具体地,每秒,对于从 1 到 n 的每个 i ,按照这个顺序,发生以下情况:

  • 如果是 i=n或 hi>hi+1 ,则 hi 的值变为 max(0,hi−1)。

在所有的 1≤i≤n第一次出现之前, hi=0 会经过多少秒?

思路

简单dp,关注到达0的时间,前面的由后面的决定。但一直没写好。浪费时间。因为没分割子问题。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void solve()
{
int n;

cin >> n;
if (n == 1)
{
int ans1 = 0;
cin >> ans1;
cout << ans1 << endl;
return;
}

for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
LL ans = 0;

for (int j = n; j >= 1; j--)
{
if (a[j] <= ans)
{
ans++;
}
else
{
ans = a[j];
}
}
cout << ans << endl;
}