优快云周赛第58期

文章包含四道编程题目,分别涉及动态规划求解最大值问题,模拟操作,特定字符串替换以及字符分析。第一题使用动态规划策略,第二题根据给定条件进行模拟计算,第三题通过遍历字符串并替换特定字符,第四题判断输入字符串中元音字母的特性来确定最后一个输入字符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

T1

在这里插入图片描述
思路:很经典的动态规划问题,枚举每一个房间,根据每一个房间选与不选来写状态计算式子

#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int n;
int a[N], f[N];
int main() {
	cin >> n;
	for (int i = 1; i <= n; i ++) cin >> a[i];
	for (int i = 1; i <= n; i ++) {
		f[i] = a[i];
		f[i] = max(f[i - 1], f[i]);
		if(i >= 2) f[i] = max(f[i - 2] + a[i], f[i]);
	}
	cout << f[n] << "\n";
	return 0;
}

T2

在这里插入图片描述
思路:根据题意模拟即可

#include <bits/stdc++.h>
using namespace std;
int main() {
	int n, k, l, c, d, p, nl, np;
	cin >> n >> k >> l >> c >> d >> p >> nl >> np;
	int x = (k * l) / nl;
	int y = c * d;
	int z = p / np;
	cout << min( {
		x / n, y / n, z / n
	}
	) << "\n";
	return 0;
}

T3

在这里插入图片描述
思路:根据题意将符合要求第一个的at字符串替换为@,以及所有符合要求的dot替换为.即可

#include <bits/stdc++.h>
using namespace std;
int main() {
	string s;
	cin >> s;
	int n = s.size();
	string ans;
	bool is_at = false;
	for (int i = 0; i < n;) {
		if(i + 2 < n && i > 0 && i + 2 != n - 1 && s[i] == 'd' && s[i + 1] == 'o' && s[i + 2] == 't') {
			ans += '.';
			i += 3;
			continue;
		}
		if(i + 1 < n && i > 0 && i + 1 != n - 1 && s[i] == 'a' && s[i + 1] == 't' && !is_at) {
			ans += '@';
			i += 2;
			is_at = true;
			continue;
		}
		ans += s[i ++ ];
	}
	cout << ans << "\n";
	return 0;
}

T4

在这里插入图片描述
思路:
根据题目的要求,我们只需要关心最后一个输入的字符是什么。根据输入字符串的首尾字符和它们是否为元音字母,我们可以得出以下情况:

  • 如果输入字符串的首尾字符都是元音字母,那么最后一个输入的字符一定是输入字符串的首字符。

  • 如果输入字符串的首尾字符都不是元音字母,那么最后一个输入的字符就是输入字符串的末字符。

  • 如果输入字符串的首字符是元音字母,而末字符不是元音字母,那么最后一个输入的字符可能是输入字符串的首字符或末字符。

综上所述,我们只需要判断输入字符串的首尾字符是否为元音字母即可确定最后一个输入的字符的可能性。

#include <iostream>
#include <string>

using namespace std;

void solution(const string& str) {
    int length = str.length();
    int pos[length];

    int index = 0;
    for (int i = 0; i < length; i++) {
        char s = str[i];
        if (s == 'a' || s == 'e' || s == 'i' || s == 'o' || s == 'u') {
            pos[index] = i;
            index++;
        }
    }

    length = index;

    if (length == 0) {
        cout << 1 << endl;
    } else if (pos[0] != 0) {
        cout << 0 << endl;
    } else {
        if (length == 1) {
            cout << (int)str.length() - pos[0] << endl;
        } else if (length % 2 == 1) {
            cout << pos[length / 2 + 1] - pos[length / 2] << endl;
        } else {
            cout << pos[length / 2] - pos[length / 2 - 1] << endl;
        }
    }
}

int main() {
    string str;
    cin >> str;

    solution(str);

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值