作业介绍

#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 小时