作业介绍

周三_刷题班2_COPY版本

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
bool cmp(string s1,string s2){
	return s1>s2;
}
//先按x从小到大,如果x相同,就按y从小到大,如果y还相同,就保持木块在地面时的先后顺序不变
bool cmp2(st s1,st s2){
	if(s1.x!=s2.x){
		return s1.x<s2.x;
	}
	if(s1.y!=s2.y){
		return s1.y<s2.y;
	}
	return s1.id<s2.id;
}
//先按y从小到大,如果y相同,就按x从小到大,如果x还相同,就保持木块在地面时的先后顺序不变
bool cmp3(st s1,st s2){
	if(s1.y!=s2.y){
		return s1.y<s2.y;
	}
	if(s1.x!=s2.x){
		return s1.x<s2.x;
	}
	return s1.id<s2.id;
}
struct st{
	int id,x,y;//id是这个物品的编号或者说位置
};
st s[100010];
int main(){
	//problem F
	//先给数组排序,排序不影响结果
	//对于每一次查询L和R,查找大于等于L第一次出现的位置,假设是p1
	//查找小于等于R 最后一次出现的位置,假设是p2 
	//那么这次查询的答案  就是 p2-p1+1;
	//  1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 4 5 6
	//problem E
	// r[i]: 记录以第i个数字 结尾  有多少个连续的范围  总和是7的倍数
	// b[i]: 记录前缀和当中  取模于7的结果 等于i的 有多少个
	//problem A
	int  x,y;
	cin>>x>>y;
	int((1.0*x/y  - x/y)*10);
	//problem B  操作很多次,每次会把数组L到R这段范围的数字 后移一个位置
	int n,a[10010],m,l,r;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	cin>>m;
	while(m--){
		cin>>l>>r;
		int tem=a[r];
		//i=r-1
		for(int i=r-1;i>=l;i--) a[i+1]=a[i];
		a[l]=tem;
	}
	for(int i=1;i<=n;i++) cout<<a[i]<<" ";
	//problem C
	int n;
	string s[6010];
	cin>>n;
	for(int i=1;i<=n;i++) {
		cin>>s[i];
		s[i]=s[i].substr(0,3);
	}
	sort(s+1,s+1+n);
	cout<<s[n]<<s[n-1];
	//problem D
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		s[i].id=i;
		cin>>s[i].x>>s[i].y;
	}
	sort(s+1,s+1+n,cmp2);
	for(int i=1;i<=n;i++) cout<<s[i].id<<" ";
	cout<<endl;
	sort(s+1,s+1+n,cmp3);
	for(int i=1;i<=n;i++) cout<<s[i].id<<" ";

}
小迪老师笔记:
A. 盗墓 7 
abs(x - y) % 10
(x + y) / 10 % 10
(x * y) / 100 % 10
(int)(10.0 * x / y) % 10

B. 盗墓 1
l = 2  r = 4
a[l] ... a[r] 向右移动一个格子 
a[2] ... a[4]
a[2] -> a[3]
a[3] -> a[4]
a[j] -> a[j + 1]:a[j + 1] = a[j]
a[r] -> a[l](特殊处理) 

C. 盗墓 2
abcdefghij
xyzkkxxxkx
xbcfzibaoejab
枚举所有组合(超时): 
abcxyz
abcxbc
xbcabc
xyzabc
xbcxyz
xyzxbc
正解:贪心,按照字典序排序,取字典序最大的 2 个

D. 盗墓 3
bool cmp1(mk a, mk b) {
	if (a.x != b.x) return a.x < b.x;
	if (a.y != b.y) return a.y < b.y;
	return a.shunxu < b.shunxu;
}
bool cmp2(mk a, mk b) {
	if (a.y != b.y) return a.y < b.y;
	if (a.x != b.x) return a.x < b.x;
	return a.shunxu < b.shunxu;
}

E. 盗墓 9
(s[r] - s[l - 1]) % 7 == 0
s[r] % 7 - s[l - 1] % 7 == 0
s[r] % 7 == s[l - 1] % 7
1、b[0]++ 需要特殊处理
2、每次计算前缀和 s
3、统计前面有多少个和 s % 7 相同
4、b[s % 7]++ 

F. 道路监控
暴力枚举:a[1] ... a[n] 有多少个 a[i] >= l && a[i] <= r
满分解法:二分 
查找第一个大于等于 l -> 下标为 p1
查找最后一个小于等于 r -> 下表为 p2 
累加 p2 - p1 + 1
需要特判查找不到的情况,p1 或 p2 为 -1 的情况时不用累加
状态
已结束
题目
6
开始时间
2025-11-26 0:00
截止时间
2026-1-10 23:59
可延期
24 小时