您的位置:首页 > 编程语言 > C语言/C++

761C Dasha and Passwordtia

2017-02-10 16:16 288 查看

题目链接:

http://codeforces.com/problemset/problem/761/C

题解:

题意大致为:给出一个n*m大小的由字符组成的矩阵,问由这些字符在满足某些条件下构成密码的最小的步数。

条件如下:

1.密码中至少有一个数字。

2.密码中至少有一个小写的字母。

3.密码中需要含有“#”或“*”或 “&”。

这道题直接暴力就可以做的,但是暴力的时候要使用贪心的思路去做就行了。

代码:

#include <cmath>
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 2500+10;
#define met(a,b) memset(a,b,sizeof(a))
#define inf 1<<26
typedef long long ll;
#define step1(x) x>='0'&&x<='9'
#define step2(x) x>='a'&&x<='z'
#define step3(x) x=='&'||x=='*'||x=='#'
int num1[maxn],num2[maxn],num3[maxn];
int n,m;
string s;

int main()
{
while(cin>>n>>m)
{
for(int i=0;i<n;i++)
{
cin>>s;
num1[i]=num2[i]=num3[i]=inf;
for(int j=0;j<m;j++)
{
int temp=min(j,m-j);
if(step1(s[j]))
num1[i]=min(num1[i],temp);
else if(step2(s[j]))
num2[i]=min(num2[i],temp);
else if(step3(s[j]))
num3[i]=min(num3[i],temp);
}
}
int ans=inf;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
{
if(i==j||j==k||k==i)
continue;
ans=min(ans,num1[i]+num2[j]+num3[k]);
}
cout<<ans <<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++