【枚举】Codeforces Round #394 (Div. 2) C. Dasha and Password

纪念死去的智商(虽然本来就没有吧……)

三重循环枚举将哪三个fix string作为数字、字母和符号位。记下最小的值就行了。

预处理之后这个做法应该是O(n^3)的,当然完全足够。不预处理是O(n^3*m)的,也够。

我写了一个O(n^2+n*m)的分类讨论贪心做法……蜜汁错,容我查一下。

现在查出个错,交了一下在in queue……容我明天看看对不对。

如果对的话,这题的加强版明年留作趣味赛题吧,嘿嘿嘿……

#include<cstdio>
#include<algorithm>
using namespace std;
int n,m;
char a[55][55];
int dis[55][4],type[55];
int main()
{
//	freopen("c.in","r",stdin);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)
	  scanf("%s",a[i]+1);
	for(int i=1;i<=n;++i)
	  {
	  	if(a[i][1]>=‘a‘ && a[i][1]<=‘z‘)
	  	  type[i]=1;
	  	else if(a[i][1]>=‘0‘ && a[i][1]<=‘9‘)
	  	  type[i]=2;
	  	else
	  	  type[i]=3;
	  	dis[i][1]=dis[i][2]=dis[i][3]=10000000;
	  	for(int j=2;j<=m;++j)
	  	  if(a[i][j]>=‘a‘ && a[i][j]<=‘z‘)
	  	    {
	  	      if(type[i]!=1)
	  	  		dis[i][1]=min(dis[i][1],min(j-1,m-j+1));
	  	    }
	  	  else if(a[i][j]>=‘0‘ && a[i][j]<=‘9‘)
	  	    {
	  	      if(type[i]!=2)
	  	        dis[i][2]=min(dis[i][2],min(j-1,m-j+1));
	  	    }
	  	  else if(type[i]!=3)
	  	  	dis[i][3]=min(dis[i][3],min(j-1,m-j+1));
	  }
	bool flag=1;
	for(int i=1;i<=n;++i)
	  if(type[i]!=1)
	    {
	      flag=0;
	      break;
	    }
	if(flag)
	  {
	  	int ans=10000000;
	  	for(int i=1;i<=n;++i)
	  	  for(int j=1;j<=n;++j)
	  	    if(i!=j)
	  	      ans=min(ans,dis[i][2]+dis[j][3]);
	  	printf("%d\n",ans);
	  	return 0;
	  }

	flag=1;
	for(int i=1;i<=n;++i)
	  if(type[i]!=2)
	    {
	      flag=0;
	      break;
	    }
	if(flag)
	  {
	  	int ans=10000000;
	  	for(int i=1;i<=n;++i)
	  	  for(int j=1;j<=n;++j)
	  	    if(i!=j)
	  	      ans=min(ans,dis[i][1]+dis[j][3]);
	  	printf("%d\n",ans);
	  	return 0;
	  }

	flag=1;
	for(int i=1;i<=n;++i)
	  if(type[i]!=3)
	    {
	      flag=0;
	      break;
	    }
	if(flag)
	  {
	  	int ans=10000000;
	  	for(int i=1;i<=n;++i)
	  	  for(int j=1;j<=n;++j)
	  	    if(i!=j)
	  	      ans=min(ans,dis[i][1]+dis[j][2]);
	  	printf("%d\n",ans);
	  	return 0;
	  }

	flag=1;
	for(int i=1;i<=n;++i)
	  if(type[i]==1)
	    {
	      flag=0;
	      break;
	    }
	if(flag)
	  {
	  	int ans=10000000;
	  	int cnt[4]={0};
	  	for(int i=1;i<=n;++i)
	  	  ++cnt[type[i]];
	  	if(cnt[2]==1)
	  	  {
	  	  	int id;
	  	  	for(int i=1;i<=n;++i)
	  	  	  if(type[i]==2)
	  	  	    {
	  	  	      id=i;
	  	  	      break;
	  	  	    }
	  	  	for(int i=1;i<=n;++i)
	  	  	  if(type[i]==3)
	  	  	    ans=min(ans,dis[i][1]);
	  	  	int tmp=10000000;
	  	  	for(int i=1;i<=n;++i)
	  	  	  if(type[i]==3)
	  	  	    tmp=min(tmp,dis[i][2]);
	  	  	ans=min(ans,tmp+dis[id][1]);
	  	  }
	  	else if(cnt[3]==1)
	  	  {
	  	  	int id;
	  	  	for(int i=1;i<=n;++i)
	  	  	  if(type[i]==3)
	  	  	    {
	  	  	      id=i;
	  	  	      break;
	  	  	    }
	  	  	for(int i=1;i<=n;++i)
	  	  	  if(type[i]==2)
	  	  	    ans=min(ans,dis[i][1]);
	  	  	int tmp=10000000;
	  	  	for(int i=1;i<=n;++i)
	  	  	  if(type[i]==2)
	  	  	    tmp=min(tmp,dis[i][3]);
	  	  	ans=min(ans,tmp+dis[id][1]);
	  	  }
	  	else
	  	  {
	  	  	for(int i=1;i<=n;++i)
	  	  	  ans=min(ans,dis[i][1]);
	  	  }
	  	printf("%d\n",ans);
	  	return 0;
	  }

	flag=1;
	for(int i=1;i<=n;++i)
	  if(type[i]==2)
	    {
	      flag=0;
	      break;
	    }
	if(flag)
	  {
	  	int ans=10000000;
	  	int cnt[4]={0};
	  	for(int i=1;i<=n;++i)
	  	  ++cnt[type[i]];
	  	if(cnt[1]==1)
	  	  {
	  	  	int id;
	  	  	for(int i=1;i<=n;++i)
	  	  	  if(type[i]==1)
	  	  	    {
	  	  	      id=i;
	  	  	      break;
	  	  	    }
	  	  	for(int i=1;i<=n;++i)
	  	  	  if(type[i]==3)
	  	  	    ans=min(ans,dis[i][2]);
	  	  	int tmp=10000000;
	  	  	for(int i=1;i<=n;++i)
	  	  	  if(type[i]==3)
	  	  	    tmp=min(tmp,dis[i][1]);
	  	  	ans=min(ans,tmp+dis[id][2]);
	  	  }
	  	else if(cnt[3]==1)
	  	  {
	  	  	int id;
	  	  	for(int i=1;i<=n;++i)
	  	  	  if(type[i]==3)
	  	  	    {
	  	  	      id=i;
	  	  	      break;
	  	  	    }
	  	  	for(int i=1;i<=n;++i)
	  	  	  if(type[i]==1)
	  	  	    ans=min(ans,dis[i][2]);
	  	  	int tmp=10000000;
	  	  	for(int i=1;i<=n;++i)
	  	  	  if(type[i]==1)
	  	  	    tmp=min(tmp,dis[i][3]);
	  	  	ans=min(ans,tmp+dis[id][2]);
	  	  }
	  	else
	  	  {
	  	  	for(int i=1;i<=n;++i)
	  	  	  ans=min(ans,dis[i][2]);
	  	  }
	  	printf("%d\n",ans);
	  	return 0;
	  }

	flag=1;
	for(int i=1;i<=n;++i)
	  if(type[i]==3)
	    {
	      flag=0;
	      break;
	    }
	if(flag)
	  {
	  	int ans=10000000;
	  	int cnt[4]={0};
	  	for(int i=1;i<=n;++i)
	  	  ++cnt[type[i]];
	  	if(cnt[1]==1)
	  	  {
	  	  	int id;
	  	  	for(int i=1;i<=n;++i)
	  	  	  if(type[i]==1)
	  	  	    {
	  	  	      id=i;
	  	  	      break;
	  	  	    }
	  	  	for(int i=1;i<=n;++i)
	  	  	  if(type[i]==2)
	  	  	    ans=min(ans,dis[i][3]);
	  	  	int tmp=10000000;
	  	  	for(int i=1;i<=n;++i)
	  	  	  if(type[i]==2)
	  	  	    tmp=min(tmp,dis[i][1]);
	  	  	ans=min(ans,tmp+dis[id][3]);
	  	  }
	  	else if(cnt[2]==1)
	  	  {
	  	  	int id;
	  	  	for(int i=1;i<=n;++i)
	  	  	  if(type[i]==2)
	  	  	    {
	  	  	      id=i;
	  	  	      break;
	  	  	    }
	  	  	for(int i=1;i<=n;++i)
	  	  	  if(type[i]==1)
	  	  	    ans=min(ans,dis[i][3]);
	  	  	int tmp=10000000;
	  	  	for(int i=1;i<=n;++i)
	  	  	  if(type[i]==1)
	  	  	    tmp=min(tmp,dis[i][2]);
	  	  	ans=min(ans,tmp+dis[id][3]);
	  	  }
	  	else
	  	  {
	  	  	for(int i=1;i<=n;++i)
	  	  	  ans=min(ans,dis[i][3]);
	  	  }
	  	printf("%d\n",ans);
	  	return 0;
	  }

	puts("0");
	return 0;
}
时间: 2024-08-02 15:12:26

【枚举】Codeforces Round #394 (Div. 2) C. Dasha and Password的相关文章

Codeforces Round #394 (Div. 2)

传送门:http://codeforces.com/contests/763,764 A题:[l,r]中有a个偶数,b个奇数,问存不存在l和r,1<=l<=r.很容易想到,如果abs(a-b)<=1,那么l和r就是存在的,除了一种情况,就是a=b=0的时候.由于l和r都大于等于1,所以当a=b=0时,不存在这种情况 #include <iostream> #include <cstdio> #include <cstring> #include <

Codeforces Round #394 (Div. 2) 解题报告

开始补题,今天下午virtual参赛,过了ABC,D题因为一点小错误而没能在比赛时间中AC,时间到了之后几分钟就发现了问题所在,略有遗憾.之后一直冥思苦想E题,在提示下终于明白,真的是给这样组合题画风的题目跪了,只能说继续加油,扩展思路吧. A题 题目地址 只有奇偶数个数相差小于等于1时可以,需要特判不能使二者均为0的情况. 参考代码 1 #include<stdio.h> 2 #include<bits/stdc++.h> 3 #include <iostream>

Codeforces Round #262 (Div. 2) 460B. Little Dima and Equation(枚举)

题目链接:http://codeforces.com/problemset/problem/460/B B. Little Dima and Equation time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Little Dima misbehaved during a math lesson a lot and the nas

Codeforces Round #417 (Div. 2) A. Sagheer and Crossroads 模拟 枚举

Codeforces Round #417 (Div. 2) A. Sagheer and Crossroads 模拟  枚举 题意 一个红绿灯 按逆时针方向一次给出各个路口的左转,直行,右转,以及行人车道让你判断,汽车是否有可能撞到行人 注意 当前车道的左转有可能撞到别的车道的行人的 题解 一大堆特判 1 #include <cstdio> 2 #include <cmath> 3 #include <cstdlib> 4 #include <cstring&g

Codeforces Round #258 (Div. 2/C)/Codeforces451C_Predict Outcome of the Game(枚举)

解题报告 http://blog.csdn.net/juncoder/article/details/38102391 题意: n场比赛其中k场是没看过的,对于这k场比赛,a,b,c三队赢的场次的关系是a队与b队的绝对值差d1,b队和c队绝对值差d2,求是否能使三支球队的赢的场次相同. 思路: |B-A|=d1 |C-B|=d2 A+B+C=k 这样就有4种情况,分别是: B>A&&C<B B>A&&C>B B<A&&C<

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) C. Jury Marks(乱搞)

题目链接:Codeforces Round #424 (Div. 2) C. Jury Marks 题意: 给你一个有n个数序列,现在让你确定一个x,使得x通过挨着加这个序列的每一个数能出现所有给出的k个数. 问合法的x有多少个.题目保证这k个数完全不同. 题解: 显然,要将这n个数求一下前缀和,并且排一下序,这样,能出现的数就可以表示为x+a,x+b,x+c了. 这里 x+a,x+b,x+c是递增的.这里我把这个序列叫做A序列 然后对于给出的k个数,我们也排一下序,这里我把它叫做B序列,如果我

[Codeforces] Round #352 (Div. 2)

人生不止眼前的狗血,还有远方的狗带 A题B题一如既往的丝帛题 A题题意:询问按照12345678910111213...的顺序排列下去第n(n<=10^3)个数是多少 题解:打表,输出 1 #include<bits/stdc++.h> 2 using namespace std; 3 int dig[10],A[1005]; 4 int main(){ 5 int aa=0; 6 for(int i=1;;i++){ 7 int x=i,dd=0; 8 while(x)dig[++dd

Codeforces Round #315 (Div. 1)

A. Primes or Palindromes? time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard output Rikhail Mubinchik believes that the current definition of prime numbers is obsolete as they are too complex and un