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;
        }
    }
}
原文地址:https://www.cnblogs.com/lcsdsg/p/14380738.html