826蓝厂笔试

第一题

有n部手机,第i部手机的总电量是a_i。
普通充电每单位时间充x的电量,闪充每单位时间充4x的电量
现在所有手机都没有电,使用闪充充满电需要多少单位时间?

输入描述:
第一行输入两个正整数n, x
第二行输入n个正整数a_i
1 ≤ n, x, a_i ≤ 100

输出描述
输出一个浮点数,代表所有手机充满电的时间

示例1:
输入
4 1
2 3 4 5

输出
3.5000000

#include <iostream>

int main() {
    int n, x;
    std::cin >> n >> x;
    
   int sum = 0;
   int num;
   for(int i = 0; i < n i++){
		cin >> num;
		sum += num;
	}
	std::cout << static_cast<float>(sum) / (4 * x) << std::endl;

    return 0;
}

画一个大小为n的O’,
输入描述:
一个正整数n,代表’O"的大小,1 <n < 10

输出描述:

5n行字符用,每个字符用长度为5n,仅由“.” "*"和“o”和 三种字符组成,代表最终的图画;

示例:
输入
1
输出

 .***.
 *ooo*
 *o.o*
 *ooo*
 .***.
#include <iostream>
#include <string>
#include <vector>
using namespace std;

vector<vector<char>> result;

void print_r(vector<vector<char>>& c){
    for(int i = 0; i < c.size(); i++){
        for(int j = 0; j < c[0].size();j++){
            cout << c[i][j];
        }
        cout << endl;
    }
}
int main(){
int n;
cin >> n;
vector<vector<char>> result(5*n,vector<char>(5*n,'.'));
    int z = n;
for(int i = 0; i < n; i++){
        for(int j = z; j < 5*n-z ; j++){
            result[i][j] = '*';
        }
        z--;
}
for(int i = n; i < 2*n; i++){
        for(int j = 0; j < 5*n ; j++){
            if(j <n || j >=4*n){
                result[i][j] = '*';
            }else{
                result[i][j] = 'o';
            }
        }
}
for(int i = 2*n; i < 3*n; i++){
        for(int j = 0; j < 5*n ; j++){
            if(j <n || j >=4*n){
                result[i][j] = '*';
            }
            else if(j >=2*n && j < 3*n){
                result[i][j] = '.';
            }else{
                result[i][j] = 'o';
            }
        }
}
for(int i = 3*n; i < 4*n; i++){
        for(int j = 0; j < 5*n ; j++){
            if(j <n || j >=4*n){
                result[i][j] = '*';
            }else{
                result[i][j] = 'o';
            }
        }
}
for(int i = 4*n; i < 5*n; i++){
		z++;
        for(int j = z; j < 5*n-z ; j++){
            result[i][j] = '*';
        }
        
}
print_r(result);


    return 0;
}

一个字符串的权值定义为字符串中"oppo"子串的数量,例如,“oppoppo的权值为2,“opop"的权值为0.
有一个仅由公’和’p’组成的字符串,想知道这个字符串的所有子串的权值之和。
输入描述
第一行输入一个仅由"o"'和"p"组成的字符串。
字符出长度不超过2×10^5.
输出描述
输出一个整数表示答案。
示例:
输入
oppoppo
输出
8

说明
oppo权值为1,有2个oppo子串
oppop权值为1
oppopp权值为1
poppo权值为1
ppoppo权值为1
oppoppo权值为2

思路是先使用回溯的方法找到所有长度大于等于4的连续子串,再使用回溯计算每个连续子串中oppo的个数,最后求和为结果

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int countOppo(string& s, int start, int end) {
    int count = 0;
    for (int i = start; i <= end - 3; ++i) {
        if (s[i] == 'o' && s[i+1] == 'p' && s[i+2] == 'p' && s[i+3] == 'o') {
            count++;
        }
    }
    return count;
}

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

    int n = s.size();
    long long totalWeight = 0;

    for (int len = 4; len <= n; ++len) {
        for (int start = 0; start <= n - len; ++start) {
            int end = start + len - 1;
            totalWeight += countOppo(s, start, end);
        }
    }

    cout << totalWeight << endl;

    return 0;
}
#include <iostream>
#include <string>
using namespace std;

// 定义一个常量 MOD 为 10^9 + 7
const int MOD = 1000000007;

// 定义一个函数,用来计算一个字符串中 "oppo" 子串的数量
int countOppo(string s) {
    // 初始化计数器为 0
    int count = 0;
    // 初始化查找位置为 0
    int pos = 0;
    // 循环查找 "oppo" 子串,直到找不到为止
    while ((pos = s.find("oppo", pos)) != string::npos) {
        // 每找到一个 "oppo" 子串,计数器加一
        count++;
        // 更新查找位置为下一个字符
        pos++;
    }
    // 返回计数器的值
    return count;
}

// 定义一个函数,用来生成所有长度大于等于 4 的连续子串,并计算它们的权值之和
int sumWays(string s) {
    // 初始化权值之和为 0
    int sum = 0;
    // 获取字符串的长度
    int n = s.size();
    // 遍历所有可能的起始位置
    for (int i = 0; i < n - 3; i++) {
        // 遍历所有可能的结束位置
        for (int j = i + 3; j < n; j++) {
            // 截取从 i 到 j 的子串
            string sub = s.substr(i, j - i + 1);
            // 计算子串中 "oppo" 的数量,并累加到权值之和中
            sum += countOppo(sub);
            // 每次累加后取模,以防止溢出
            sum %= MOD;
        }
    }
    // 返回权值之和
    return sum;
}

int main() {
    // 输入字符串
    string s;
    cin >> s;
    // 调用函数,计算所有子串的权值之和
    int ans = sumWays(s);
    // 输出结果
    cout << ans << endl;
    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值