作业介绍
#include<bits/stdc++.h>
#define int long long
using namespace std;
bool isHui(string s){
int l = 0, r = s.size() - 1;
while (l < r){
if (s[l] != s[r]) return 0;
l++;
r--;
}
return 1;
}
signed main(){
//问题D
int n, a[5010], s[5050], mmii = 1e9;
s[0] = 0;
cin >> n;
for (int i = 1; i <= n; i++){
cin >> a[i];
s[i] = s[i - 1] + a[i];
}
for (int i = 1; i <= n; i++){//前i个数字 划分给第一个部分
for (int j = i + 1; j <= n; j++){//枚举的是第二个部分的结束位置
//第一个部分 下标是从1到i
//第二个部分 下标是从i+1到j
//第三个部分 下标是从j+1到n
int s1 = s[i];
int s2 = s[j] - s[i + 1 - 1];
int s3 = s[n] - s[j + 1 - 1];
int ma =-1e9, mi = 1e9;
ma = max(ma, s1);
ma = max(ma, s2);
ma = max(ma, s3);
mi = min(mi, s1);
mi = min(mi, s2);
mi = min(mi, s3);
mmii = min(mmii, ma - mi);
}
}
//问题C
int t;
string s;
cin >> t;
while (t--){
cin >> s;
int flag = 0;
//flag=0默认不可以 flag=1默认可以
for (int i = 2; i <= s.size() - 1; i++){//把前i个字符 分给第一个字符串 剩下的分给第二个字符串
//第一个字符串下标是从0 到 i-1
string s1 = s.substr(0, i);
string s2 = s.substr(i);
if (isHui(s1) == 1 && isHui(s2) == 1 && s2.size() >= 2) flag = 1;
}
if (flag == 1) cout << "Yes\n";
else cout << "No\n";
}
//问题B
int n, a[1010];
cin >> n;
int cnt = n;
for (int i = 1; i <= n; i++) a[i] = 0;
while (cnt > 1){//这个while循环每执行一次,就模拟一遍从前往后报数的过程
int s = 0;
for (int i = 1; i <= n; i++){
if (a[i] == 1) continue;
s++;
if (s % 2 == 1){
a[i] = 1;
cnt--;
}
}
}
for (int i = 1; i <= n; i++){
if (a[i] == 0) cout << i;
}
//问题A
int n, a[110], ans = 0, len = 0;
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++){
if (a[i] % 2 == 0) len++;
else {
ans = max(ans, len);
len = 0;
}
}
ans = max(ans, len);
cout << ans;
return 0;
}
小迪老师笔记:
A 连续的最长偶数序列
考点:连续性问题
if (a[i] % 2 == 0) s++;
else s = 0;
求 s 的最大值
B 幸运观众(luck)
考点:模拟
int m = 0;
for (int i = 1; i <= n; i++) {
if (i % 2 == 0) {
m++;
a[m] = a[i];
}
}
// m 就是新数组的大小
C [GESP202409三级] 回文拼接
考点:字符串、回文串
s = "abaccdcc"
s.substr(pos, len)
// i:2 ~ s.size() - 2
string a = s.substr(0, i);
string b = s.substr(i);
ab accdcc
string a = s.substr(0, 2);
string b = s.substr(2);
aba ccdcc
string a = s.substr(0, 3);
string b = s.substr(3);
D 粉刷匠
考点:前缀和、区间和
2 2 3 6 5
2 | 2 | 3 6 5
2 | 2 3 | 6 5
2 2 3 | 6 | 5
第一个分割点 i:1 ~ n - 2
第二个分割点 j: i + 1 ~ n - 1
int a = s[i]; // 第一段:1 ~ i
int b = s[j] - s[i + 1 - 1]; // 第二段:i + 1 ~ j
int c = s[n] - s[j + 1 - 1]; // 第三段:j + 1 ~ n
E 勇者
考点:贪心
1、用攻击力最高的刀先把魔物的血量砍到可以直接投掷而亡
-> 所有刀投掷可以消耗的血量总和 s
-> r = h - s; 必须用刀砍的血量
2、挑攻击力最高的刀来砍 r,计算砍的次数 k
细节:
1、把 2 个数组都从大到小排序
sort(a + 1, a + n + 1, greater<int>());
sort(b + 1, b + n + 1, greater<int>());
2、如果 b[i] <= a[1] 说明第 i 把刀投掷的攻击力还不如用第 1 把刀砍
-> break 跳出循环,交给第 1 把刀去砍
3、如果 s >= h 说明循环中途的前 i 把刀就足够把魔物投掷而亡了
F 晒衣服
考点:二分答案
sum = w[1] + w[2] + ... + w[n]
l = 1, r = sum
二分弄干衣服的时间 t
w[i] / a 是衣服自然烘干的时间
如果 w[i] / a > t,说明剩余的湿度 r = w[i] / a - t 需用用烘干机
所有剩余湿度 r 的去计算 r / b(向上取整) 的总和就是使用烘干机的时间总和
-> 该总和必须也 <= t
- 状态
- 已结束
- 题目
- 6
- 开始时间
- 2025-12-3 0:00
- 截止时间
- 2026-1-3 23:59
- 可延期
- 24 小时