码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #699 (Div. 2)

时间:2021-02-06 12:18:29      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:size   cin   中间   ems   break   cout   tin   def   map   

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;
    }
}

 

Codeforces Round #699 (Div. 2)

标签:size   cin   中间   ems   break   cout   tin   def   map   

原文地址:https://www.cnblogs.com/lcsdsg/p/14380738.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!