• AcWing 第57 场周赛


    AcWing 4485. 比大小

    思路:
    枚举即可,语法题

    #include <bits/stdc++.h>
    using namespace std;
    const double pi = acos(-1.0);
    #define x first
    #define y second
    #define LL long long 
    #define int LL
    #define pb push_back
    #define all(v) (v).begin(),(v).end()
    #define PII pair<int,int>
    #define ll_INF 0x7f7f7f7f7f7f7f7f
    #define INF 0x3f3f3f3f
    #define debug(x) cerr << #x << ": " << x << endl
    #define io ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
    LL Mod(LL a,LL mod){return (a%mod+mod)%mod;}
    LL lowbit(LL x){return x&-x;}//最低位1及其后面的0构成的数值
    LL qmi(LL a,LL b,LL mod) {LL ans = 1; while(b){ if(b & 1) ans = ans * (a % mod) % mod; a = a % mod * (a % mod) % mod; b >>= 1;} return ans; }
    int _;
    int n; 
    void solve()
    {
        cin>>n;
        int s1=0,s2=0;
        for(int i=0;i<n;i++)
        {
            int x;
            cin>>x;
            s1+=x;
        }
        for(int i=0;i<n;i++)
        {
            int x;
            cin>>x;
            s2+=x;
        }
        if(s1>=s2)puts("Yes");
        else puts("No");
    }
    signed main()
    {
        io;
        //cin>>_; 
     // while(_--)
        solve();
        return 0;
    }
    
    作者:Leimz
    链接:https://www.acwing.com/activity/content/code/content/3669431/
    来源:AcWing
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    AcWing 4486. 数字操作

    思路:
    贪心的角度思考:只乘一次并且很顺利的除下去是操作数最小的,那么我们需要找到那个乘的数字。
    n n n进行因式分解, 5184 = 2 6 ∗ 3 4 5184=2^6*3^4 5184=2634
    6 , 4 6,4 6,4补成比他们大的最小的 2 2 2的次方也就是 8 8 8
    那么给 5184 ∗ 2 2 ∗ 3 4 5184*2^2*3^4 51842234,为什么是8?因为每次求算术平方根,相当于 指 数 / 2 指数/2 /2所以找的是2的次方

    #include <bits/stdc++.h>
    using namespace std;
    const double pi = acos(-1.0);
    #define x first
    #define y second
    #define LL long long 
    #define int LL
    #define pb push_back
    #define all(v) (v).begin(),(v).end()
    #define PII pair<int,int>
    #define ll_INF 0x7f7f7f7f7f7f7f7f
    #define INF 0x3f3f3f3f
    #define debug(x) cerr << #x << ": " << x << endl
    #define io ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
    LL Mod(LL a,LL mod){return (a%mod+mod)%mod;}
    LL lowbit(LL x){return x&-x;}//最低位1及其后面的0构成的数值
    LL qmi(LL a,LL b,LL mod) {LL ans = 1; while(b){ if(b & 1) ans = ans * (a % mod) % mod; a = a % mod * (a % mod) % mod; b >>= 1;} return ans; }
    int _;
    int n; 
    vector<PII>v;
    int maxv;
    void get_fact()
    {
        for(int i=2;i<=n/i;i++)
        {
            if(n%i==0)
            {
                int s=0;
                while(n%i==0)
                {
                    n/=i;
                    s++;
                }
                maxv=max(maxv,s);
                v.pb({i,s});
            }
        }
        if(n>1)v.pb({n,1});
    }
    void solve()
    {
        cin>>n;
        get_fact();
        int s=1;
        while(s<maxv)s<<=1;
        bool f=false;
        for(int i=0;i<v.size();i++)
        {
            if(v[i].y<s)
            {
                f=true;
                break;
            }
        }
        int res=f;
        int m=s;
        while(m)
        {
            res++;
            m>>=1;
        }
        res--;
        int ans=1;
        for(int i=0;i<v.size();i++)
        {
            ans*=v[i].x;
        }
        cout<<ans<<' '<<res<<endl;
    }
    signed main()
    {
        io;
     // cin>>_; 
     // while(_--)
        solve();
        return 0;
    }
    
    作者:Leimz
    链接:https://www.acwing.com/activity/content/code/content/3669771/
    来源:AcWing
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82

    AcWing 4487. 最长连续子序列

    思路:
    首先对式子进行分析
    在这里插入图片描述
    相当于求一个最长区间的平均数并且除以100大于零
    前缀和表示是 S [ r ] − S [ l − 1 ] > 100 ∗ ( l e n ) S[r]-S[l-1]>100*(len) S[r]S[l1]>100(len)
    即:预处理 S [ r ] − 100 ∗ r S[r]-100*r S[r]100r
    枚举左端点,找出最大的右端点,如果 r < l r<l r<l不符合,求最长的 l e n len len
    这里的 m x mx mx数组时进行二分的关键,因为前缀和数组不一定满足单调性, m x mx mx数组基于动态规划的思想,将 r r r之后的最大值复制给 r r r
    同样此题可以用单调栈做。

    #include <bits/stdc++.h>
    using namespace std;
    const double pi = acos(-1.0);
    #define x first
    #define y second
    #define LL long long 
    #define int LL
    #define pb push_back
    #define all(v) (v).begin(),(v).end()
    #define PII pair<int,int>
    #define ll_INF 0x7f7f7f7f7f7f7f7f
    #define INF 0x3f3f3f3f
    #define debug(x) cerr << #x << ": " << x << endl
    #define io ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
    LL Mod(LL a,LL mod){return (a%mod+mod)%mod;}
    LL lowbit(LL x){return x&-x;}//最低位1及其后面的0构成的数值
    LL qmi(LL a,LL b,LL mod) {LL ans = 1; while(b){ if(b & 1) ans = ans * (a % mod) % mod; a = a % mod * (a % mod) % mod; b >>= 1;} return ans; }
    int _;
    int n; 
    const int N=1e6+10;
    int a[N];
    int s[N],mx[N];
    void solve()
    {
        cin>>n;
        for(int i=1;i<=n;i++)cin>>a[i];
        for(int i=1;i<=n;i++)s[i]=s[i-1]+a[i];
        for(int i=0;i<=n;i++)s[i]-=100*i;
        mx[n+1]=-ll_INF;
        for(int i=n;i>=0;i--)mx[i]=max(mx[i+1],s[i]);
        int res=0;
        for(int i=0;i<n;i++)
        {
            int l=i+1,r=n;
            while(l<r)
            {
                int mid=l+r+1>>1;
                if(mx[mid]>s[i])l=mid;
                else r=mid-1;
            }
            if(mx[l]<=s[i])continue;
            res=max(res,l-i);
        }
        cout<<res<<endl;
    
    }
    signed main()
    {
        io;
     // cin>>_; 
     // while(_--)
        solve();
        return 0;
    }
    
    作者:Leimz
    链接:https://www.acwing.com/activity/content/code/content/3670626/
    来源:AcWing
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
  • 相关阅读:
    Shell入门1
    14、三维表面重建-DeepSDF
    数论——中国剩余定理及其扩展详解
    最强大脑记忆曲线(5)——主程序设计
    vue实现tagsview多页签导航功能
    docker将Java、vue、nginx打进镜像(涉及容器打成镜像)
    如果再写for循环,我就锤自己了
    easy-excel 解决百万数据导入导出,性能很强
    如何自己生成fip.bin在Milkv-duo上跑freertos
    FVM管理Flutter 环境
  • 原文地址:https://blog.csdn.net/qq_52765554/article/details/125478756