5.23真题训练

1. 小美有一个长度为n的数组,她最多可以进行k次操作,每次操作如下:

选择两个整数i, j(1 ≤ i < j ≤ n)
选择两个整数x, y 使得x * y = a_i * a_j
将a_i替换为x,将a_i替换为y
她希望最多进行k次操作后,最后数组中的元素总和尽可能大。

输入描述
一行两个整数 n, k, 表述数组长度和操作的次数
一行n个整数a_1、a_2……a_n,表示数组的元素。
1 ≤ k < n ≤ 10^5
1 ≤ a_i ≤ 10^5

输出描述
输出一个整数,表示最后数组中的元素做那个和最大值,结果对10^9+7取模

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

输出
65

说明
第一次操作后,数组变为[1, 2, 12, 1, 5]
第二次操作,数组变为[1, 2, 60, 1, 1]

import sys
import math
# for line in sys.stdin:
#     a = line.split()
#     print(int(a[0]) + int(a[1]))

n,k=map(int,input().split())
a = list(map(int, input().split()))

a.sort(reverse=True)

# 话说可以x=a[i]*a[j] y=1
for _ in range(k):
    x=a[0]*a[1]
    y=1
    a[0]=x
    a[1]=y
    a.sort(reverse=True)
print(sum(a))

2.小红的字符串切割

时间限制:1.000S  空间限制:256MB

题目描述

小红拿到了一个字符串,她希望你帮她切割成若干子串,满足以下两个条件: 

1. 子串长度均为不小于 3 的奇数。

2. 子串内部的字符全部相同。

输入描述

第一行输入一个正整数n,代表字符串长度。第二行输入一个字符串,仅由小写字母组成。

输出描述

如果无解,请输出-1。否则按顺序输出若干个字符串,用空格隔开。

输入示例
11
aaabbbbbbbb
输出示例
aaa bbb bbbbb
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
    int n;
    cin >> n;

    string s;
    cin >> s;
    
    vector<string> result;
    int i = 0;
    while (i < n) {
        int j = i;
        while (j < n && s[j] == s[i]) {
            ++j;
        }
        int len = j - i;
        while (len >= 3) {
            result.push_back(s.substr(i, len % 2 == 0 ? len - 1 : len));
            len -= 2;
        }
        i = j;
    }
    
    if (result.empty()) {
        cout << -1 << endl;
    } else {
        for (const string& str : result) {
            cout << str << " ";
        }
        cout << endl;
    }

    return 0;
}

3. 字符逆序

将一个字符串str的内容颠倒过来,并输出。

如:输入“I am a student”,输出“tneduts a ma I”。

保证字符串长度不超过100。

#include <iostream>
#include <string> 
#include<algorithm>//reverse 函数
using namespace std;

int main() {
    string s;
    //cin>>s; //不合适
    //cin >> s; 是用来读取一个由空白(例如空格、制表符或换行符)分隔的字符串
    //例如,如果用户输入 "hello world",那么 cin >> s; 只会获取 "hello",并且下一次 cin 会从 "world" 开始读取。
    getline(cin, s); //是用来读取一整行的输入,直到遇到换行符
    reverse(s.begin(), s.end());
    cout<<s<<endl;
    return 0;
    }

// 64 位输出请用 printf("%lld")

4.小美走公路
有一个环形的公路,上面共有n站,现在给定了顺时针第站到第 i+1站之间的距离(特殊的,也给出了第n站到第1 站的距离)。小美想沿着公路第x站走到第站,她想知道最短的距离是多少?
时间限制:C/C++1秒,其他语言2秒
空间限制:C/C++256M,其他语言512M
输入描述:
第一行输入一个正整数n,代表站的数量。第二行输入几个正整数ai,前n -1个数代表顺时针沿着公路走,i站到第 i+1站之间的距离;最后一个正整数代表顺时针沿着公路走,第n站到第1站的距离。·
第三行输入两个正整数x和y,代表小美的出发地和目的地。
1 ≤ n ≤ 10^5
1 ≤ ai  ≤ 10^9
7 < x, y < n

输入描述:

一个正整数,代表小美走的最短距离。

示例1

输入例子:

3
1 2 2
2 3

输出例子:

2
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int n;
    cin >> n;

    vector<int> distance(n);

    for (int i = 0; i < n; i++) {
        cin >> distance[i];
    }

    int x, y;
    cin >> x >> y;

    if (x > y) {
        swap(x, y);
    }

    long long sum1 = 0;
    long long sum2 = 0;

    for (int i = x - 1; i < y - 1; i++) {
        sum1 += distance[i];
    }

    for (int i = 0; i < x - 1; i++) {
        sum2 += distance[i];
    }

    for (int i = y - 1; i < n; i++) {
        sum2 += distance[i];
    }

    cout << min(sum1, sum2) << endl;

    return 0;
}
n = int(input())
distance = list(map(int, input().split()))
x, y = map(int, input().split())

# 令x是索引在前的车站,y是索引在后的车站
# 另外,由于题目所给的车站索引是从1开始的
# 为了能够映射到数组distance中的索引
# 需要进行-1的操作
x, y = (x-1, y-1) if x < y else (y-1, x-1)
# 求两段距离
# 第一段为:从x顺时针走到y,对应的距离为sum(distance[x:y])
# 第二段为:从y顺时针走到x,对应的距离为sum(distance[:x]) + sum(distance[y:])
# 两者取较小值,即为答案
print(min(sum(distance[x:y]), sum(distance[:x]) + sum(distance[y:])))

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值