2025.2.22
Hehe_0 模拟赛内容随笔
[NOIP2015]金币
| 1 | 2 | 3 | 4 | 。。。 |
|---|---|---|---|---|
| 1 | 2-3 | 4-6 | 7-10 | 。。。 |
观察数据范围1e4,暴力就行,然后可以去思考优化版本
由于已经把规律给出来了,所以可以提前离线处理出来,如果数据过大,可以预处理每一次金币变化的天数,然后根据提问二分找区间然后求和。这种数据就可以开很大数据范围了
[NOIP2014]比例简化
很经典的题,观察数据范围发现L很小,所以直接暴力枚,如果L扩大的话,需要在枚举的时候不要太暴力
然后读题,需要注意里面要求化简后的分式要大,而且还要比较大小,其他部分就暴力枚就行
if(__gcd(i,j)==1&&i*b>=a*j&&i*ans2<j*ans1)
{
ans1=i;
ans2=j;
}
渴望力量吗
区间问题是一种在竞赛中经常会遇见的问题,观察数据范围发现nq时间复杂度也是并不是很离谱,数据小一点随便暴力去处理。然后进行优化的就是加上二分,我们可以去对于每个人的时间和喜好进行排序,然后对区间询问的k和l进行排序,注意区间不包含。
这样我们的数据都变有序的,每个人喜好相同的放在一起了,然后二分去寻找l和r这个时间区间包含的人,所以这个二分也是很简单。由于数字本身可能会很大有些人习惯用vector开容器可能方便一些。
int l1=lower_bound(p,p+n,k)-p;
int r1=upper_bound(p,p+n,k)-p;
int L=lower_bound(id+l1,id+r1,l)-id;
int R=upper_bound(id+l1,id+r1,r)-id-1;
ans[++cnt]=R-L+1;
移动石头
我选这个题的时候就有很强的既视感,我们平时想贪心的时候有一个经典的问题就是一个无序数列给他排序所需的最少的移动次数。
其实这个题就进行模拟就行,由于我们没有考虑我们石子的具体移动方案,我们只需要最后的结果,所以我们只需要记录每一对的石头数量差值,这就是我们需要移动的数量,然后对这个值求和就行。
勤奋的杨老师

如图,差不多就是上面我画的这种感觉,不过是有>=和<=的情况,我们挑出这个问题其中一部分是不是就是最长不上升(下降)子序列。
所以处理出从前往后和从后往前的最长不下降子序列然后枚举断点就可以了,注意处理后的存储。然后最长不上升(不下降)的问题dp或者直接upperlower二分处理都可以。
[HNOI2006]马步距离
遇见第一眼就是dp搜索然后开始暴力写,暴力写的话是没有边界的,所以需要我们如果x或者y偏离很远就退出去,然后尽可能接近终点在接近的时候开始模拟(搜索靠近)。然后看到数据范围也可以知道有一定数学规律,我们可以先bfs打表找规律。坐标虽然可以是负数,但是四个象限其实都是一样的,翻转一下就行。
我打的表看上去可能会有点眼花,所以就截的比较小

while(x+y>=10)
{
if(x<y)
swap(x,y);
if (x-4>=2*y)
x-=4;
else
x-=4,y-=2;
ans+=2;
}//对坐标进行跳跃的化简
化简后就进行简单暴力的搜索就行了。然后数学规律方法的证明啥的可见别的博客 [ (](【ACWing】2135. 马步距离(配数学证明)_国际象棋,一个棋盘,有一个马,一个象,规则和我们中国象棋一样,给定 两个坐标 a,b,-CSDN博客)
[AHOI2009]FLY 飞行棋
我选这个题就是感觉读起来挺有意思的。矩形特点对角线相等,然后在这个圆里对角线都过圆心,四个弧相等,直角边和所对直角边的两个大弧也相等。所以可以枚举两个点去判断是不是直径,也有弧上另一端,判断就行。
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=b[i-1]+a[i];
tot+=a[i];
}
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
int s=b[j]-b[i];
if(s*2==tot)
ans++;
}
}
cout<<ans*(ans-1)/2;
小红的01连续段
原本选这个是当作dp,后续发现其实还有二分前缀和做法。
因为?是不确定的,如果最后我们选择一段都是1/0那么我们应该把?也都变成1/0,dp的状态设计就是前i个最好情况(分成0/1去记录)
for(int i=1;i<=n;i++)
{
if(s[i]=='?')
{
dp[i][1]=dp[i-1][1]+1;
dp[i][0]=dp[i-1][0]+1;
}
else
{
dp[i][s[i]-'0']=dp[i-1][s[i]-'0']+1;
}
ans=max({ans,dp[i][0],dp[i][1]});
}

浙公网安备 33010602011771号