#4772. 2026/2/10/LH笔记(下标计数+模拟)
2026/2/10/LH笔记(下标计数+模拟)
当前没有测试数据。
#include
using namespace std;
const int N=2e5+10;
int t,n,a[N],b[110];
//数组计数,下标计数
//就是用数组来记录一些数据 只是这些数据 和数组的下标正好对应上了
//1 2 3
//b[i]:统计数字i的出现次数
//b[i+100]:统计数字i的出现次数
//b[0]:统计数字-100的出现次数
//b[3]
//a数组里面有n个数字 这些数字的大小是从-100,到100
//还是想统计每个数字的出现次数
//下标不能是负数,为了解决这个问题
//解决方案1:开另外一个数组 专门用来记录负数的出现次数
//解决方案2:把下标整体 加一个偏移量,这样的话 可以保证下标就不会越界了
//a数组里面有n个数字 这些数字的大小是从0.0-->10.0 最多只有一位小数
//这个问题的话 我们可以把下标乘以10 然后再记录
//假设 b[i]统计a数组当中 数字i的出现次数
//b数组的最大值 有什么特殊含义吗???
//5-->1 2 2 3 3
//b数组的值 存的是 某个数字的出现次数
//b数组的最大值 其实是 出现次数最多的那个数字 出现了多少次
//b数组的最大值下标 到底是哪个数字他的出现次数是最多的
//利用下标计数/数组计数 进行排序 计数排序
//冒泡 插入 选择 sort
//虽然计数排序 非常快 时间复杂度是 O(n) 但是局限性很大 一般是不使用计数排序的
//都是用数组 来记录数字的出现次数
//但是 数组不仅仅可以用来记录数字的出现次数 还可以用来标记物品的状态
//b[i]标记第i盏灯被操作过几次
//b[i]来表示第i个小矮人 还在不在 b[i]=1 b[i]=0
//课后作业1: 灯的开关这道题目 也有数学方法
//一边统计数字的出现次数 一边计算答案
c[i] 存的是-i的出现次数
int main(){
cin>>n;
for(int i=1;i>a[i];//-100
b[a[i]+100]++;//b[0];
}
for(int i=0;i
using namespace std;
const int N=2e5+10;
int t,n,a[N];
//模拟算法: 我们要思考一下 我们要记录哪些信息
//我们就开一些变量来记录就可以了
//在模拟算法这里 一定要学会调试代码
int n,a[N],len,ans;//总共有n天 x第一天是星期几
//数组里有n个数字 求最长的连续上升的长度是多少
//连续性问题当中 边界问题
//解决方案1: 我在a数组的最后面再一个值
//解决方案2: 等for循环结束之后 我再额外判断一次
//len是我到某个位置的时候 当前的最长连续上升长度 是几
//求a数组当中 最长的 连续偶数的长度
//众数这道题目的思路:
//1.先找出现次数最多的数字 出现了多少次
//2.统计有几个众数
//3.看一下这几个众数 分别是数字几
int main(){
cin>>n;
for(int i=1;i>a[i];
if(a[i]>a[i-1]){
len++;
}else{
if(len>ans) ans=len;
len=1;
}
}
if(len>ans) ans=len;
return 0;
}
#include
using namespace std;
const int N = 2e5 + 10;
int n, m, a[N], wz, bs;
// 如何判断一道题目 到底是用for循环 还是while循环
// 如果你很清楚这个循环的次数就用for循环
int main(){
cin >> n >> m;
//有n个人 报数报到m的会被枪毙
for (int i = 1; i > a[i];
if (a[i] == 0) a[i] = 2;
}
int sy = n;
//shengyu 目前游戏还有多少monkey存活
while (sy > 1){
wz++;
if (wz == n + 1) wz = 1;
if (a[wz] == 0){
bs++;
if (bs == m){
a[wz]--;
if (a[wz] == 0){
sy--;
}
bs = 0;
}
}
}
for(int i=1;i0){
cout<<i;
}
}
return 0;
}