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