情况

时间:2024年7月11日22:35
not again

题解

A - Only Pluses

题意

3个数,你最多5次给三个数中一个加1.最大乘积。

思路

尽量相等

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int a,b,c;cin >> a >> b >> c;
for(int i=0;i<5;i++){
if (a <=b&&a<=c){
a++;
}else
if (b <= a && b <= c)
{
b++;
}
else if(c <= a && c <= b)
{
c++;
}
}
cout << a * b * c << endl;

问题

写的太麻烦了,不能用sort吗

B - Angry Monk

题意

一段分成k块。每次能:
从一块切下来1;或将一块和旁边的1补上
至少多少次能补全?

思路

找到长度最大的一块。对于剩下的,次数=(a[i] - 1) * 2 + 1;

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void solve()
{
int n, k;
cin >> n >> k;
vector<int> a(k);
int ans = 0;
int sum = 0;

for (int i = 0; i < k; i++)
{
cin >> a[i];
if (a[i] == 1)
sum += 1;
else
sum += (a[i] - 1) * 2 + 1;
ans = max(ans, a[i]);
}

cout << sum - (2 * ans - 1) << endl;
}

问题

C - Gorilla and Permutation

题意

g(i) 是长度为 i 的前缀上的置换中所有不大于 m 的数字的总和。类似地,Gorilla提出了函数 f ,其中 f(i)是长度为 i 的前缀上的排列中不小于 k 的所有数字的总和。长度为 i 的前缀是由原始数组的前 i个元素组成的子数组。
给m,f,数组长度。
求fi的和-gi的和最大的情况。

思路

10 9 8 7 6 5 4 1 2 3
最大的放前面使fi大。等到能满足gi就从一开始。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void solve()
{
int n, m, k;
cin >> n >> m >> k; // gi<=m fi>=k
vector<int> a(n);
int tag = 0;
for (int i = n; i > 0; i--)
{
if (i > m)
cout << i << ' ';
else
{

break;
}
}
for (int i = 1; i <= m; i++)
cout << i << ' ';

cout << '\n';
}

D

题意

人,能跳m,一共能游k,河里有鳄鱼,有原木。能否过?

思路

贪心。
记录上一个鳄鱼和上一个原木位置。
读到原木,检测跳能否直接跳。
不行,则看能否跳+游泳。

代码

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
void solve()
{
int n, m, k; // m 跳跃强度 k是只能游泳k米
cin >> n >> m >> k;
int lastlog = 0;
int cocof = 0;
string datas,datas2;
datas.append("L");
cin >> datas2;
datas.append(datas2);

datas.append("L");
for (int i = 0; i < datas.size(); i++)
{
char data = datas[i];

if (data == 'L')
{
int onelong = i - lastlog;
if (onelong <= m)
{
lastlog = i;
continue;
}
else
{
int sunhao = onelong - m;

if (i - cocof <= sunhao || k < sunhao )
{
cout << "NO" << endl;
return;
}
else
{
k -= sunhao;
lastlog = i;
continue;
}
}
}
else if (data == 'C')
{
cocof = i;
}
}
cout << "YES" << endl;
}

问题

cin>>data覆盖字符串了!前面得加一个L表示刚开始
大佬的读入:

  1. cin >> N >> M >> K >> river;
  2. river =“L”+ river +“L”;

E

题意

n*a-b=n个a相连去掉最后b个数。

思路

该题范围小。
看注释。

代码

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
void solve()
{
int n;
cin >> n;
vector<pair<int, int>> res;
for (int a = 1; a <= 10000; a++)
{
string s = to_string(n);
int len = int(s.size());//一位数,len=1,两位数,len=2

while (s.size() < 8) // n*a-B最多只能是7位数,这意味着对于每个a,B最多只能有7个值
{
s += s;
}
for (int b = a * len - 1; b >= a * len - 8; b--)//还是那句话,结果
{
if (1 <= b && b <= 10000)
{
int w = a * len - b;
string t = s.substr(0, w);//结果字符串
if (stoi(t) == n * a - b)
{
res.emplace_back(a, b);//push_back,结果加一种。
}
}
}
}
cout << res.size() << '\n';
for (auto &[a, b] : res)
{
cout << a << " " << b << '\n';
}
}

问题

tourist牛