1. 程式人生 > 實用技巧 >12.3補題

12.3補題

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