zoukankan      html  css  js  c++  java
  • Educational Codeforces Round 19

    A水题,数论都算不上吧,分解一下就行了,看分解的书是不是比k大

    B求奇数和,wa了四发。。先把大于0的全部加起来,如果奇数直接输出,如果偶数就找最小的大于0的那个奇数和最大的那个小于0 的奇数,比较和减大于0 和加小于0 谁大就输出谁

    复杂度O(n)

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<cassert>
    #include<iomanip>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pi acos(-1)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    
    using namespace std;
    
    const double g=10.0,eps=1e-9;
    const int N=100000+10,maxn=100000+10,inf=0x3f3f3f;
    
    int a[N];
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n,sum=0,maxx=-100000,minn=100000;
        cin>>n;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
            if(a[i]>0)
            {
                if(a[i]&1)minn=min(minn,a[i]);
                sum+=a[i];
            }
            else if(a[i]&1)maxx=max(maxx,a[i]);
        }
        if(sum&1)cout<<sum<<endl;
        else
        {
            if(sum==minn)cout<<sum+maxx<<endl;
            else cout<<max(sum+maxx,sum-minn)<<endl;
        }
        return 0;
    }
    b

    C题比赛时还是没做出来,先从后向前求最小值,用一个栈维护,扫描字符串s,如果当前栈顶元素比s剩下的数全小就输出它

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<cassert>
    #include<iomanip>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pi acos(-1)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    
    using namespace std;
    
    const double g=10.0,eps=1e-9;
    const int N=100000+10,maxn=100000+10,inf=0x3f3f3f;
    
    int minn[N];
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        string s;
        cin>>s;
        int n=s.size();
        minn[n-1]=s[n-1]-'a';
        for(int i=n-2;i>=0;i--)
        {
            minn[i]=min(minn[i+1],s[i]-'a');
        }
        string ans="";
        for(int i=0;i<n;i++)
        {
            string p="";p+=s[i];
            char t=s[i];
            int cur=minn[i];
            while(i+1<n&&cur!=s[i]-'a'){
                i++;
                p+=s[i];
            }
            string q="";q+=s[i];
            while(i+1<n&&t>s[i+1]){
                q+=s[i+1];
                i++;
            }
            ans+=q;
            reverse(p.begin(),p.end());
            p=p.substr(1,p.size()-1);
            ans+=p;
        }
        cout<<ans<<endl;
        return 0;
    }
    c

    D题不会

    E题如果直接模拟会超时,可以分成两段做,如果k够大,直接模拟,如果k小,用数组记录d【k】【p】,如果p+a【p】+k>n,d[k][p]=1;否则d[k][p]=d[k][p+a[p]+k]+1

    如果直接用第二个方法会爆内存,所以两个结合起来使用

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<cassert>
    #include<iomanip>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pi acos(-1)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    
    using namespace std;
    
    const double g=10.0,eps=1e-9;
    const int N=100000+10,maxn=300,inf=0x3f3f3f;
    
    int a[N];
    int d[maxn+10][N];
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n,m;
        cin>>n;
        for(int i=1;i<=n;i++)cin>>a[i];
        for(int k=1;k<=maxn;k++)
        {
            for(int i=n;i>=1;i--)
            {
                if(i+a[i]+k>n)d[k][i]=1;
                else d[k][i]=d[k][i+a[i]+k]+1;
            }
        }
        cin>>m;
        while(m--){
            int p,k,ans=0;
            cin>>p>>k;
            if(k>=maxn)
            {
                while(p<=n){
                    p+=(a[p]+k);
                    ans++;
                }
                cout<<ans<<endl;
            }
            else cout<<d[k][p]<<endl;
        }
        return 0;
    }
    E

    F题不会~

  • 相关阅读:
    memcached stats 命令
    C# 压缩文件 ICSharpCode.SharpZipLib.dll
    复选框的全选与反选
    Internet Explorer 9 已安装在此系统上
    C# AES 加密与解密
    C# List<T> 泛型
    C# DataTbale详细操作
    C# 日志系统 log4net 配置及使用
    Web.config配置文件详解
    字符串比较
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/7132272.html
Copyright © 2011-2022 走看看