模拟题 ural 1784. Rounders

题目链接:

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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值