寒假集训一补题与题解
A
分析
排序+中位数性质
AC代码
手搓快排玩玩,嘿嘿🤭🤭
B
分析
这里要我们求连续不小于f块地的栅栏所围的奶牛的平均数的最大值。
根据要求可知,所求平均数最大值一定在每单个区域奶牛数量的最大值和最小值之间。
那么现在就可以很明显的看出,这是一个二分查找左区间的右边界点的题目。
我们只需从每单个区域奶牛数量的最大值和最小值之间二分查找答案即可。
AC代码
#include<iostream>
using namespace std;
const int N=100010;
int n,m,c[N];
double sum[N];
bool check(double avg)
{
for(int i=1;i<=n;i++) sum[i]=sum[i-1]+c[i]-avg;//计算前缀和
double minv=0;//设置最小值
for(int i=0,j=m;j<=n;j++,i++)
{
minv=min(minv,sum[i]);//找最优极小值
if(sum[j]>=minv) return true;//进行判断
}
return false;//如果所有的都不满足,那么这个平均数就一定不满足
}
int main()
{
scanf("%d%d",&n,&m);
double l=0,r=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&c[i]);
r = max(r, (double)c[i]);
}
while(r-l>1e-5)
{
double mid=(l+r)/2;
if(check(mid)) l=mid;
else r=mid;
}
printf("%d\n ",int(r*1000));
return 0;
}
C
分析
两边的牛高 中间的牛矮数据范围很大所以我们可以使用差分但是题目最高又限制了最高的牛所以我们还需要查重
AC代码
D
分析
炸弹的范围是R,可以看成每个城市的影响范围是R,找出最多的重叠部分就可以了
用到二维前缀和
AC代码
F
分析
题目中的操作都是在数据的最后一位所以可以用对顶栈就是top对着top的栈
AC代码
G
分析
入队
先判断小组是否有人,如果没人,将小组编号加入 pointer 中
将新人加入她所在的小组
出队
先判断pointer指向的第一个小组还有没有人
——如果没人,就出队第一个小组编号,去判断第二个
然后正常出队即可
AC代码


浙公网安备 33010602011771号