• Codeforces Round #598 (Div. 3)(全)


    比赛时候傻逼了卡在b上,最后4题,e还没来的及看

    总结这套div3还挺简单的,就补完了

    A

    Payment Without Change

    standard input/output

    1 s, 256 MBSubmit Add to favourites x6485B

    Minimize the Permutation

    standard input/output

    1 s, 256 MBSubmit Add to favourites x3290C

    Platforms Jumping

    standard input/output

    1 s, 256 MBSubmit Add to favourites x1140D

    Binary String Minimizing

    standard input/output

    1 s, 256 MBSubmit Add to favourites x2313E

    Yet Another Division Into Teams

    standard input/output

    2 s, 256 MBSubmit Add to favourites x339F

    Equalizing Two Strings

    standard input/output

    1 s, 256 MBSubmit Add to favourites x280

    A

    水题if判断

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
        long long a,b,n,s;
        scanf("%I64d%I64d%I64d%I64d",&a,&b,&n,&s);
        long long num=min(s/n,a);
        num=s-num*n;
        if(num<=b)
        {
            printf("YES
    ");
        }
        else
        {
            printf("NO
    ");
        }
        }
    }

    B 写复杂了,开始想的模拟每次把队列中最小的元素移动到最靠前的位置

    其实直接循环然后标记一下当前位置即可

    #include<bits/stdc++.h>
    using namespace std;
    int a[105];
    int pos[105];
    int vis[105];
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            memset(vis,0,sizeof(vis));
            vector<int>a;
            int n;
            scanf("%d",&n);
            for(int i=0;i<n;i++)
            {
                int tmp;
                scanf("%d",&tmp);
                a.push_back(tmp);
                pos[tmp]=i;
            }
            int cur=0;
            for(int i=1;i<=n;i++)
            {
                if(vis[i]!=0) continue;
                if(pos[i]>cur)
                {
                    for(int j=pos[i];j>cur;j--)
                    {
                        swap(a[j],a[j-1]);
                    }
                    for(int j=pos[i]-1;j>=cur;j--)
                    {
                        vis[a[j]]++;
                    }
                    cur=pos[i];
                }
                else if(i==a[cur]) cur++,vis[i]++;
            }
            for(int i=0;i<n;i++)
                printf("%d ",a[i]);
            printf("
    ");
        }
    }
    

    C

    直接贪心就行了,不知道过的人怎么这么少

    #include<bits/stdc++.h>
    using namespace std;
    int len[10005];
    int main()
    {
        int n,m,d;
        scanf("%d%d%d",&n,&m,&d);
        int sum=0;
        for(int i=1; i<=m; i++)
        {
            scanf("%d",&len[i]);
            sum+=len[i];
        }
        int num=n-sum;
        if(num>(d-1)*(m+1))
        {
            printf("NO
    ");
        }
        else
        {
            printf("YES
    ");
            for(int i=1; i<=m; i++)
            {
                int tmp=d-1;
                while(tmp&&num)
                {
                    printf("0 ");
                    num--;
                    tmp--;
                }
                while(len[i])
                {
                    printf("%d ",i);
                    len[i]--;
                }
            }
            while(num)
            {
                printf("0 ");
                num--;
            }
        }
    }

    D 直接贪心把0移动到最前面

    #include<bits/stdc++.h>
    using namespace std;
    int a[1000005];
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            long long n,k;
            scanf("%lld%lld",&n,&k);
            for(int i=1;i<=n;i++)
            {
                scanf("%01d",&a[i]);
            }
            int num=1;
            int last1=0;
            int last2=0;
            for(int i=1;i<=n;i++)
            {
                last2=i;
                if(a[i]==0)
                {
                    if(k>i-num)
                    {
                        k-=i-num;
                        num++;
                    }
                    else
                    {
                        last1=i-k;
                        break;
                    }
     
                }
            }
            //cout<<num<<" "<<last1<<" "<<last2<<endl;
            for(int i=1;i<=n;i++)
            {
                if(i<num) printf("0");
                else if(i==last1) printf("0");
                else if(i<=last2) printf("1");
                else printf("%d",a[i]);
            }
            printf("
    ");
        }
    }

    E dp+路径回溯

    反向思考看能够减去的最大值

    只要遍历3个即可因为别的可以转移过来

    #include<bits/stdc++.h>
    using namespace std;
    struct node
    {
        int id;
        int num;
        int col;
        friend bool operator < (node p,node q)
        {
            return p.num<q.num;
        }
    }a[200005];
    int dp[200005];
    bool cmp(node p,node q)
    {
        return p.id<q.id;
    }
    int main()
    {
        vector<int>ve;
        memset(dp,0,sizeof(dp));
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i].num);
            a[i].id=i;
        }
        sort(a+1,a+1+n);
        int MAX=0;
        int pos=0;
        for(int i=4;i<=n-2;i++)
        {
            for(int j=3;j<=5;j++)
            {
                if(i>j)
                {
                    dp[i]=max(dp[i-j]+a[i].num-a[i-1].num,dp[i]);
                }
            }
            if(dp[i]>MAX)
            {
                MAX=dp[i];
                pos=i;
            }
        }
        while(pos>3)
        {
            int flag=0;
            for(int i=3;i<=5;i++)
            {
                if(dp[pos]-dp[pos-i]==a[pos].num-a[pos-1].num)
                {
                    flag=1;
                   ve.push_back(pos);
                   pos=pos-i;
                   break;
                }
            }
            if(flag==0) break;
        }
        sort(ve.begin(),ve.end());
        int tmp=1;
        int cur=0;
    //    cout<<ve[0]<<" "<<ve[1]<<endl;
        for(int i=1;i<=n;i++)
        {
            if(cur>=ve.size()||i!=ve[cur]) a[i].col=tmp;
            else
            {
                cur++;
                tmp++;
                a[i].col=tmp;
            }
        }
        printf("%d %d
    ",a[n].num-a[1].num-MAX,ve.size()+1);
        sort(a+1,a+1+n,cmp);
        for(int i=1;i<=n;i++)
        {
            printf("%d ",a[i].col);
        }
    }

    F 每次交换两个数我们可以得到任意一个序列

    如果没有同种元素,两个序列逆序对的差的绝对值变化都是偶数 所以判断逆序对即可

    #include<bits/stdc++.h>
    using namespace std;
    int viss[100];
    int vist[100];
    char s[200005];
    char t[200005];
    int n;
    void solve()
    {
        memset(viss,0,sizeof(viss));
        memset(vist,0,sizeof(vist));
        for(int i=1; s[i]; i++)
        {
            viss[s[i]-'a']++;
            vist[t[i]-'a']++;
        }
        for(int i=0; i<26; i++)
        {
            if(viss[i]!=vist[i])
            {
                printf("NO
    ");
                return;
            }
        }
        for(int i=0; i<26; i++)
        {
            if(viss[i]>1)
            {
                printf("YES
    ");
                return ;
            }
        }
        int cnt1=0;
        int cnt2=0;
        for(int i=1; i<=n; i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                if(s[i]>s[j]) cnt1++;
                if(t[i]>t[j]) cnt2++;
            }
        }
        if(cnt1%2==cnt2%2)
        {
            printf("YES
    ");
        }
        else
        {
            printf("NO
    ");
        }
    }
    int main()
    {
        int _;
        scanf("%d",&_);
        while(_--)
        {
            scanf("%d",&n);
            scanf("%s",s+1);
            scanf("%s",t+1);
            solve();
        }
    }
  • 相关阅读:
    dynamic不能使用扩展方法
    C# .Net 中字典Dictionary<TKey,TValue>泛型类 学习浅谈
    C# .Net List<T>中Remove()、RemoveAt()、RemoveRange()、RemoveAll()的区别,List<T>删除汇总
    Tomcat配置虚拟目录映射
    JAVA中令人疑惑的字符串
    JAVA控制台版斗地主
    JAVA学习路线
    vue安装(npm和cnpm)
    ThinkPad笔记本无法禁用触摸屏【亲测,有用】
    boostrap弹框之BootstrapDialog
  • 原文地址:https://www.cnblogs.com/caowenbo/p/11852188.html
Copyright © 2020-2023  润新知