题目链接:
http://acm.timus.ru/problem.aspx?space=1&num=1784
题目意思:
一副牌分成4堆,每堆13张牌,每堆值从前至后为2-KA,牌色可能不一样。
现在可以有两种操作:1.从一堆中顶开始拿同一花色的k张,组成新的一堆。
2、从一堆中顶开始那同一花色的k张,放到当前堆的上面,要求是当前堆的第一张牌的值比要放堆的底的值大一。
问最少需要多少步操作,使得每一堆牌的花色一样。
解题思路:
模拟题+贪心思想。对于每一列,牌的值肯定相同,花色各不一样。
以最后一列为标准,从倒数第二列开始往前,当当前列有两个不后面一列的花色不一样时,要移动3次,
当有三个不一样时要移动4次,注意当有四个不一样时分两种情况,如果是恰好两对相互不一样,要移动6次,如果四个混合的不一样则要移动5次。
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF (1<<30)
#define PI acos(-1.0)
using namespace std;
char save[5][14][5];
int main()
{
while(scanf("%s",save[1][1])!=EOF)
{
for(int i=1;i<=4;i++)
{
for(int j=1;j<=13;j++)
{
if(i==1&&j==1)
continue;
scanf("%s",save[i][j]);
}
}
int ans=0;
for(int i=12;i>=1;i--)
{
int cnt=0;
for(int j=1;j<=4;j++)
if(save[j][i][1]!=save[j][i+1][1])
cnt++;
if(cnt==0)
continue;
if(cnt<=3)
ans+=cnt+1;
else if(cnt==4) //如果四个不一样的时候,分两种情况,一种是混合的不一样
{ //另外一种是两对相互不一样,这时移动的次数不一样
ans+=cnt+1;
int j=2;
for(j=2;j<=4;j++)
if(save[1][i][1]==save[j][i+1][1])
break;
if(save[j][i][1]==save[1][i+1][1])
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}