• Codeforces Round #699 (Div. 2)


    A. Space Navigation

    签到题

    #include<bits/stdc++.h>
    #include<iostream>
    #include<map>
    #include<cstdio>
    #include<cmath>
    #define  mem(a,b) memset(a,b,sizeof a)
    #define ll long long int
    using namespace std;
    map<char,int>mp;
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            mp.clear();
            int x,y;
            cin>>x>>y;
            string s;
            cin>>s;
            for(int i=0;i<s.length();i++)
            {
                mp[s[i]]++;
            }
            bool flag = true;
          //  cout<<mp['R']<<" "<<mp['L']<<mp['U']<<mp['D']<<endl;
            if(x>0&&mp['R']<abs(x))
            {
                flag = false;
            }
            if(x<0&&mp['L']<abs(x))
            {
                flag = false;
            }
            if(y>0&&mp['U']<abs(y))
            {
                flag = false;
            }
            if(y<0&&mp['D']<abs(y))
            {
                flag = false;
            }
            if(!flag )
            {
                puts("NO");
            }
            else{
                puts("YES");
            }
        }
    }

    B. New Colony

    题意:有k块石头从i=1的地方落下,如果h[i]<h[i+1]那么那块石头会停在那个地方,并把那个地方的高度加1,问第k块石头在那,如果没在这中间输出-1.

    题解:直接暴力求解。

    #include<bits/stdc++.h>
    #define  mem(a,b) memset(a,b,sizeof a)
    #define ll long long int
    using namespace std;
    int h[1010];
    int n,k;
    bool check()
    {
        for(int i=1;i<=n;i++)
        {
            if(h[i]<h[i+1]) return false;
        }
        return true;
    }
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            mem(h,0);
            cin>>n>>k;
            for(int i=1;i<=n;i++)
            {
                cin>>h[i];
            }
            int ans = 0;
            int q = 0;
            while(!check())
            {
                for(int i=1;i<=n;i++)
                {
                    if(h[i]<h[i+1])
                    {
                        q = i;
                        h[i]++;
                        break;
                    }
                }
                ans++;
                if(ans==k) break;
            }
            /*for(int i=1;i<=n;i++)
            {
                cout<<h[i]<<" ";
            }
            cout<<endl;*/
            if(ans<k||q==0)
            {
                puts("-1");
            }
            else{
                cout<<q<<endl;
            }
        }
    }

    C. Fence Painting

    题意:给出三个数组,让第数组a变成数组b,按照数组c的元素改变数组a,问是否可以形成数组b,如果可以并且按次序输出c要改变的位置。

    题解:先把a和b数组不一样的位置统计出来,并用set[b[i]]存储,然后再遍历一遍c看set[c[i]]是否为空,如果为空开一个vector vv存一下,如果不为空那么我们就可以把vector vv里的数改变的位置全为set[c[j]].begin()的位置。再开一个vector v存一下他们改变的位置。最后判断一下是否都改完了,如果vv不为空最后那我们判断一下vv的最后一个元素是否再b数组中出现过,那么我们同样全部取这个位置,。

    #include<bits/stdc++.h>
    #define  mem(a,b) memset(a,b,sizeof a)
    #define ll long long int
    using namespace std;
    int a[100100],b[100010],c[100100];
    set<int>v1[100100];
    set<int>v2[100010];
    vector<int>v;
    vector<int >vv;
    map<int,int>mp;
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            v.clear();
            vv.clear();
            mp.clear();
            int n,m;
            cin>>n>>m;
            for(int i=1;i<=n;i++)
            {
                v1[i].clear();
                v2[i].clear();
            }
            for(int i=1;i<=n;i++)
            {
                cin>>a[i];
            }
            for(int i=1;i<=n;i++)
            {
                cin>>b[i];
                mp[b[i]] =i;
                if(b[i]==a[i])
                {
                    continue;
                }
                else{
                    v2[b[i]].insert(i);
                }
            }
            for(int i=1;i<=m;i++)
            {
                cin>>c[i];
            }
            for(int i=1;i<=m;i++)
            {
                if(v2[c[i]].size()!=0)
                {
                    for(int j=0;j<vv.size();j++)
                    {
                        v.push_back(*v2[c[i]].begin());
                    }
                    vv.clear();
                    v.push_back(*v2[c[i]].begin());
                    v2[c[i]].erase(*v2[c[i]].begin());
                }
                else{
                    vv.push_back(c[i]);
                }
            }
            bool flag = true;
            int ans = vv.size();
            int pp = -1;
            for(int i=0;i<vv.size();i++)
            {
                if(mp[vv[i]])
                {
                    pp = i;
                    v.push_back(mp[vv[i]]);
                    ans--;
                }
                else{
                    break;
                }
            }
            for(int i=1;i<=n;i++)
            {
                if(v2[i].size()!=0)
                {
                    //cout<<i<<"xx"<<endl;
                    flag = false;
                    break;
                }
            }
            //cout<<flag<<endl;
            if(ans==0&&flag)
            {
                //cout<<"1xxx"<<endl;
                puts("YES");
                for(int i=0;i<v.size();i++)
                {
                    cout<<v[i]<<" ";
                }
                cout<<endl;
                continue;
            }
            if(ans!=0&&flag &&mp[vv[vv.size()-1]])
            {
                //cout<<ans<<endl;
                //cout<<"xxx"<<endl;
                puts("YES");
                for(int i=0;i<v.size();i++)
                {
                    cout<<v[i]<<" ";
                }
                for(int i=pp+1;i<vv.size();i++)
                {
                    cout<<mp[vv[vv.size()-1]]<<" ";
                }
                //cout<<endl;
                cout<<endl;
                continue;
            }
            puts("NO");
            //cout<<endl;
        }
    }

     D. AB Graph

    题意:给出一张图,每条边上有一个字母a或者b,问有没有一条路长度为m组成回文串,可以由重复一条路径组成。

    题解:先判断m的奇偶性,如果为奇数,一定存在,如果为偶数,看看有没有村早mp[i][j]==mp[j][i],如果有直接输出。已经判断了不存在mp[i][j] == mp[j][i],所以如果n==2那么一定是no的,然后再找mp[i][j]==mp[j][k]的i,j,k,如果存在的话那么就分m%4是否等于2输出就好了。

    #include<bits/stdc++.h>
    #include<iostream>
    #include<map>
    #include<cstdio>
    #include<cmath>
    #define  mem(a,b) memset(a,b,sizeof a)
    #define ll long long int
    using namespace std;
    const int maxn = 1010;
    char mp[1010][1010];
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            int n,m;
            cin>>n>>m;
            for(int i=1;i<=n;i++)
            {
                scanf("%s",mp[i]+1);
            }
            if(m%2)
            {
                puts("YES");
                for(int i=1;i<=m+1;i++)
                {
                    cout<<i%2+1<<" ";
                }
                cout<<endl;
                continue;
            }
            bool flag = true;
            for(int i=1;i<=n;i++)
            {
                for(int j=i+1;j<=n;j++)
                {
                    if(mp[i][j] == mp[j][i])
                    {
                        puts("YES");
                        for(int k=1;k<=m+1;k++)
                        {
                            if(k%2) cout<<j<<" ";
                            else{
                                cout<<i<<" ";
                            }
                        }
                        flag = false;
                        break;
                    }
                }
                if(!flag)
                {
                    break;
                }
            }
            if(!flag )
            {
                continue;
            }
            if(n==2) 
            {
                puts("NO");
                continue;
            }
            int a = -1, b = -1, c= -1;
            bool found = false;
            for(int i=1;i <=n && !found; i++) 
            {
                for(int j=1; j<=n && !found; j++)
                {
                    for(int k=1; k<=n && !found; k++)
                    {
                        if(i!=j and j!=k)
                        {
                            if(mp[i][j] == mp[j][k]) a=i, b=j, c=k, found=true;
                        }
                    }
                }
            }
            if(m%4==2){
                vector<int> v;
                v.push_back(a);
                v.push_back(b);
                v.push_back(c);
                v.push_back(b);
                puts("YES");
                for(int i=0;i <=m; i++) cout << v[i%v.size()] << " ";
                cout << endl;
            }
            else{
                vector<int> v ;
                v.push_back(a);
                v.push_back(b);
                v.push_back(c);
                v.push_back(b);
                puts("YES");
                for(int i=1;i <=m+1; i++) cout << v[i%v.size()] << " ";
                cout << endl;
            }
        }
    }
  • 相关阅读:
    将多个字典添加到数组输出
    获取字典中的数组
    数组内的元素排序
    1字符串中的world替换为i bookan wisdom2.字符串的相加字符串输出,长度3比较字符串大小4截取字符串5字符串内所有a都替换成A6判断字符串是否以http开头7将字符串内admin和123截取出来8字符添加
    判断是否有前缀后缀
    截取字符串
    大小写
    数据存字典,block排序,删除
    block排序
    描述器 排序(根据属性)
  • 原文地址:https://www.cnblogs.com/lcsdsg/p/14380738.html
Copyright © 2020-2023  润新知