Codeforces Round #394 (Div. 2) C.Dasha and Password(暴力)
http://codeforces.com/contest/761/problem/C
题意:
给出n个串,每个串的初始光标都位于0(列)处,怎样移动光标能够在凑出密码(每个串的光标位置表示一个密码的字符,密码至少包含3种字符:数字,小写字母,特殊符号)的情况下使得移动的光标步数最小。
思路:
因为每个串只提供一个密码,所以我们先预处理计算出每个字符串3种字符的最少移动步数。
然后接下三重循环枚举,分别表示数字,小写字母,特殊符号由第i,j,k行提供。
1 #include<iostream> 2 #include<string> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #include<cstdio> 7 using namespace std; 8 9 const int inf=100; 10 11 int n,m; 12 char s[55][55]; 13 int w[55][3]; 14 15 int main() 16 { 17 //freopen("D:\\input.txt", "r", stdin); 18 while(~scanf("%d%d",&n,&m)) 19 { 20 for(int i=0;i<n;i++) 21 scanf("%s",&s[i]); 22 for(int i=0;i<n;i++) 23 { 24 w[i][0]=w[i][1]=w[i][2]=inf; 25 for(int j=0;j<m;j++) 26 { 27 if(isdigit(s[i][j])) w[i][0]=min(w[i][0],min(j,m-j)); 28 else if(islower(s[i][j])) w[i][1]=min(w[i][1],min(j,m-j)); 29 else w[i][2]=min(w[i][2],min(j,m-j)); 30 } 31 } 32 33 int ans=3*inf; 34 for(int i=0;i<n;i++) 35 { 36 for(int j=0;j<n;j++) 37 { 38 for(int k=0;k<n;k++) 39 { 40 if(i==j||j==k||i==k) continue; 41 ans=min(ans,w[i][0]+w[j][1]+w[k][2]); 42 } 43 } 44 } 45 printf("%d\n",ans); 46 } 47 return 0; 48 }