B题,给一个键盘,有shift键和小写字母组成,给一个手能够到的最大距离,然后问需要两个手的最小次数,我做的时候就是遇到了shift键就把它可以覆盖到的区域标记,然后在把出现过的小写字母记录,如果这个字母正好在范围里那就不用另一个手,否则就用,然后在输入的时候就可以o(1)的判断,当时写的时候多写了一行..........

#include<bits/stdc++.h>
using namespace std;
#define LL long long
char p[500][500];
int vis[10000];
int gu[500][500];
int n,m,x;
void cha(int v,int y)
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            
            if((v-i)*(v-i)+(y-j)*(y-j)<=x*x)gu[i][j]=1;
        }
    }
}
int main()
{
    
    cin>>n>>m>>x;
    int flag=0;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cin>>p[i][j];
            if(p[i][j]=='S')
            {
                cha(i,j);
                flag=1;
            }
        }
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            //if(vis[p[i][j]]==1)continue;
            if(p[i][j]>='a'&&p[i][j]<='z')
            vis[p[i][j]]=1;
            //cout<<gu[i][j]<<" ";
            if(flag==1&&p[i][j]>='a'&&p[i][j]<='z')
            {
                if(vis[p[i][j]-32]==1)continue;
                if(gu[i][j]==1)
                vis[p[i][j]-32]=1;
                else vis[p[i][j]-32]=2;
            }
        }
        //cout<<endl;
    }
    int r;
    cin>>r;
    int num=0,res=0;

    for(int i=0;i<r;i++)
    {
        char u;
        cin>>u;
        //cout<<vis[u]<<endl;
        if(vis[u]==0)
        {
            res=1;
        }
        else
        {
            num=num+vis[u]-1;
        }
    }
    if(res==1)cout<<-1<<endl;
    else
    cout<<num<<endl;
}
View Code

 D题,当时一直看B题D又很长就没看,有两种操作,一种是定义,一种查询,如果&的个数多于* 就是错误,否则就是void  没定义过的也是错误的,如果是void类型的输出的时候要去除所有的&以及相同数量的*,代码:

#include<map>
#include<algorithm>
#include<string>
using namespace std;
map<string,int>q;
int n;
int main ()
{
    cin>>n;
    q["void"]=1;
    for(int i=0;i<n;i++)
    {
        string take;
        cin>>take;
        if(take=="typedef")
        {
            string s1,s2;
            cin>>s1>>s2;
            string str="";
            int cnt=0;
            for(int i=0;i<s1.size();i++)
            {
                if(s1[i]=='&')
                cnt--;
                else if(s1[i]=='*')
                cnt++;
                else
                str+=s1[i];
            } 
            int sum=0;
            sum=q[str];
            if(sum>0)
            sum+=cnt;
            else
            sum=0;
            q[(string)s2]=sum;
        }
        else
        {
            string s1;
            cin>>s1;
            int cnt=0;
            string str="";
            for(int i=0;i<s1.size();i++)
            {
                if(s1[i]=='&')
                cnt--;
                else if(s1[i]=='*')
                cnt++;
                else
                str+=s1[i];
            }
            int sum=0;
            sum=q[str];
            if(sum>0)
            sum+=cnt;
            else
            sum=0;
            if(sum<=0)
                cout<<"errtype"<<endl;
            else
            {
                cout<<"void";
                for(int i=1;i<sum;i++)
                {
                    cout<<"*";
                }
                cout<<endl;
            }
        }
    }
} 
View Code

 

posted on 2020-12-06 11:59  小灰灰的父亲  阅读(66)  评论(0编辑  收藏  举报