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:])))