情况

完成:A/B1
时间:2024年7月23日22:35

题解

A

题意

边长n正方形。确定在所有 k 芯片放置中占用对角线的最小可能数量。

思路

刚开始1个。后面2个。

代码

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
void solve()
{
int n,k;
cin >> n >> k;
if(k == 0)
{
cout << 0 << "\n";
return;
}

if(n>=k){
cout << 1 << "\n";
return;
}
int ans = 1;
k-=n;
for (int i = n-1; i >= 1; --i)
{
k -= i;
ans++;
if (k <= 0)
break;
k -= i;
ans++;
if (k <= 0)
break;
}
cout << ans << "\n";
}

B1

题意

一个女孩正在为她的生日做准备,她想买一束最漂亮的花束。店里一共有 n 朵花,每朵花的特点是花瓣的数量,一朵有 k 花瓣的花要花 k 枚硬币。女孩已经决定,她将在她的花束中使用的任何两朵花之间的花瓣数量之差不应超过一。与此同时,女孩希望用最大可能的花瓣数组装花束。不幸的是,她只有 m 硬币,她不能花更多。她最多能在花束中收集多少花瓣?

思路

双端队列。还有一种map做法。

代码

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
void solve()
{

int n, m;
cin >> n >> m;
vector<int> a(n);
// vector<int> b(n);
for (int i = 0; i < n; ++i)
{
cin >> a[i];
}
sort(a.begin(), a.end());
// for (int i = 1; i < n; ++i)
// {
// b[i] = a[i] - a[i - 1];
// }
int ans = 0;
int lastz= n - 1;
int temp = 0;
for (int i = n - 1; i >= 0; --i)
{
if (a[i] > m)
{
continue;
}

temp+=a[i];
while (temp > m || (a[lastz] - a[i] > 1))
{

temp -= a[lastz];
lastz--;
}
if(temp<=m)
ans = max(temp, ans);
}
cout << ans << "\n";
} // 1 1 1 2 4 5 6 7

问题

TLE因为重复计算太多了。

B2

题意

这是问题的困难版本。唯一不同的是,在这个版本中,不是列出每种花的花瓣数量,而是为所有类型的花设置了花瓣数量和商店中的花朵数量。
一个女孩正在为她的生日做准备,她想买一束最漂亮的花束。店里总共有 n 种不同类型的花,每种花的特点是花瓣的数量和这种花的数量。一朵有 k 瓣的花要花 k 枚硬币。女孩已经决定,在任何两个花之间的花瓣数量的差异,她将用来装饰她的蛋糕不应该超过一个。与此同时,女孩希望用最大可能的花瓣数组装花束。不幸的是,她只有 m 硬币,她不能花更多。她最多能在花束中收集多少花瓣?

思路

如下

代码

jiangly思路

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int, int>

void solve()
{

int n, m;
cin >> n >> m;
vector<int> a(n);
map<int, int> f;

// vector<int> b(n);
for (int i = 0; i < n; ++i)
{
cin >> a[i];
}
for (int i = 0; i < n; ++i)
{
int c;
cin >> c;
f[a[i]] = c;
}
int ans = 0;
for (auto [x, y] : f)
{
ans = max(ans, x * min<int>(y, m / x));
if (f.contains(x + 1))
{
int z = f[x + 1]; // x+1的花数量
int c;
if (x * y >= m)
{
c = m / x; // X的量超过了,x只能取c个
}
else
{
c = y + min<int>(z, (m - x * y) / (x + 1)); // x的量减去了之后剩的给x+1
}
ans = max(ans, min(m, c * x + min<int>(z, c)));
}
}

std::cout << ans << "\n";
}

// 1 1 1 2 4 5 6 7

signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T;
cin >> T;
while (T--)
solve();

/*code by achen_Karma*/
}

问题

用map