NOIP2025模拟赛24

T1 T2 T3 T4
\(\color{#52C41A} 普及+/提高\) \(\color{#3498DB} 提高+/省选-\) \(\color{#9D3DCF} 省选/NOI-\) \(\color{#0E1D69} NOI/NOI+\)

参赛网址:https://oj.33dai.cn/d/TYOI/contest/689ad798c5d9c2f14c20b17f

T2,T4未完成搭建

T1 寄希地【NOIP2025模拟赛T1】

题目传送门

题目难度:\(\color{#52C41A} 普及+/提高\)

算法标签:搜索,搜索与剪枝

~首先说 《我将 100 AC 改为 0 RE 这件事》!~

:::info[来源]
来源:2024ICPC亚洲区域赛昆明站G

cf链接:https://codeforces.com/gym/105588/problem/G

2024ICPC亚洲区域赛昆明站G题面:https://codeforces.com/gym/105588/attachments/download/28814/2-statement-chinese.pdf

2024ICPC亚洲区域赛昆明站G题解:https://codeforces.com/gym/105588/attachments/download/28803/tutorial.pdf
:::

思路

由于具有明显提示性,本题没有大样例。

首先考虑打表,通过 \(\text {Dp}\) 或搜索。

然后我们发现答案在 \(17\) 以内,搜索时间复杂度 \(O(2^{17})\)结案

复杂度的证明

标准题解证明详细过程

设两数分别为 \(x\),\(y\)

  • 情况1:\(x\)\(y\) 奇偶性不同,

    \(\because\) \(x\)\(y\) 奇偶性不同.

    \(\therefore\) \(\gcd(x,y) \equiv 1 \pmod{2}\).

    \(x \equiv 1 \pmod{2}\).

    则如果使 \(x-\gcd(x,y)\).

    那么 \(x\)\(y\) 在二进制下末尾都为 \(0\),即 \(x \equiv y \equiv 0 \pmod{2}\),我们可以视为 同时删除 \(x\)\(y\) 的末尾.

  • 情况2:\(x\)\(y\) 奇偶性相同,

    \(\because\) \(x\)\(y\) 奇偶性相同.

    \(\therefore\) \(\gcd(x,y) \equiv 0 \pmod{2}\).

    那么 \(x\)\(y\) 在二进制下末尾都为 \(0\),即 \(x \equiv y \equiv 0 \pmod{2}\),同时删除 \(x\)\(y\) 的末尾对答案相当于 \(+2\).

所以答案最大为 \(2 \times log_2 a+1+1\).

AC Code

std:2ms

#include <bits/stdc++.h>
#define int long long
using namespace std;

int T;
int n,m;
struct node{int n,m,dis;};
queue<node> Q;

int bfs(){
    while (Q.size()>0)  Q.pop();
    Q.push({n,m,0});
    while (Q.size()>0){
        node t=Q.front();Q.pop();
        int x=t.n,y=t.m;
        if (x==0&&y==0) return t.dis;
        int gcd=__gcd(x,y);
        if (x==0)   gcd=y;
        if (y==0)   gcd=x;
        Q.push({x-gcd,y,t.dis+1});
        Q.push({x,y-gcd,t.dis+1});
    }
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>T;
    while (T--){
        cin>>n>>m;
        cout<<bfs()<<"\n";
    }
    return 0;
}

T2 后缀的前缀之和【NOIP2025模拟赛T2】

题目传送门

题目难度:\(\color{#3498DB} 提高+/省选-\)

算法标签:字符串,Trie树,后缀数据结构,数据结构,Hashing,其他,二分查找,分治

T3 大金币【NOIP2025模拟赛T3】

题目传送门

题目难度:\(\color{#9D3DCF} 省选/NOI-\)

算法标签:模拟,递推,其他,二分查找,数学,分块

:::info[来源]
来源:2024ICPC亚洲区域赛昆明站C

cf链接:https://codeforces.com/gym/105588/problem/C

2024ICPC亚洲区域赛昆明站题面:https://codeforces.com/gym/105588/attachments/download/28814/2-statement-chinese.pdf

2024ICPC亚洲区域赛昆明站题解:https://codeforces.com/gym/105588/attachments/download/28803/tutorial.pdf
:::

思路

https://oj.33dai.cn/d/TYOI/p/N0740/solution

考虑第 \(i\) 轮淘汰的第一个人,\(a_i=\lceil \frac{a_{i-1}\times k}{k-1} \rceil\)

可以通过打表得知,为什么我没发现

直接暴力太慢了,时间复杂度 \(O(n)\)

\(a_i=\lceil \frac{a_{i-1}\times k}{k-1} \rceil=a_{i-1}+\lceil \frac{a_{i-1}}{k-1} \rceil\)

所以可以每次考虑增量 \(c=\lceil \frac{a_{i-1}}{k-1} \rceil\)

二分即可。

AC Code

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int maxn=1e7+5;
int T;
int n,k;
int dp[maxn];

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>T;
    while (T--){
        cin>>n>>k;
        dp[1]=1;
        int x=1,num=0,d=0;
        while (1){
            d=(x+k-2)/(k-1);
            int l=0,r=(n-x+d)/d,ans=0;
            while (l<=r){
                int mid=(l+r)>>1;
                if ((x+mid*d+k-2)/(k-1)<=d){
                    l=mid+1;
                    ans=mid;
                }
                else    r=mid-1;
            }
            num=ans+1;
            if (x+num*d>=n){
                x+=((n-x)/d)*d;
                break;
            }
            x+=num*d;
        }
        cout<<x<<"\n";
    }
    return 0;
}

T4 道路定向【NOIP2025模拟赛T4】

题目传送门

题目难度:\(\color{#0E1D69} NOI/NOI+\)

算法标签:贪心,搜索,折半搜索,动态规划,树形DP

posted @ 2025-09-28 07:13  Zzqyoung1121  阅读(11)  评论(0)    收藏  举报