ZOJ 1171 Sorting the Photos

1. 题目描述

给你一叠照片,有的正面朝上,有的反面朝上,朝上的用字母U,朝下的用字母D

可以从一个位置开始到最顶端,把这一叠拿出来,反转,然后再放回那一叠照片上面。

      试求出最少的翻转次数,使所有的照片朝向一样。

输入格式

第一行输入一个整数表示有组测试数据。随后是组测试数据。

每组测试数据给出照片的张数m, 然后输入一些字符,包括‘U’表示朝上,’D’表示朝下,还有一些空格,回车

输出格式

对于每组测试数据输出一行,内容为使照片翻转次数尽可能少的方案数。

每个样例之间用空行隔开

输入样例

1

5
UU D
UU

输出样例

2

2. 题目分析和算法实现

首先分析输入,对于每个样例的输入,我采用getchar(),其中这些字符里面有用的字符就只有‘U’和‘D’,所以只要判断‘U’和’D’的个数是否到m个即可。

思路分析:把每个连续的U或者D看成一个小整体,只要翻转同步,可以看成一张。然后从上往下依次翻,当遇到朝向不一样的照片时,我们就把上面所有的照片都反转一下即可,接着就继续往下,直到所有的朝向都一样了为止。

所以我们只要计算朝向不一样的次数即可。而朝向不一样的次数等于小整体的个数,所以我们在输入时就直接计算这种小整体的个数S,那么答案即为S-1

3. 问题实现及代码分析

 
#include<stdio.h>
#include<string.h>
int main()
{
      int i,j,k,t,n;
      scanf("%d",&t);
      while(t--)
      {
            scanf("%d",&n);
            int flag=0,pre=-1;//flag表示小整体的个数
                             //pre表示之前那个小整体的朝向
            char s;
            while(n)
            {
                  s=getchar();
                  if(s=='U'||s=='D')
                  {
                        n--;//是照片,个数减一
                        if(s!=pre)//与前面的不一样,个数加一
                                  //且pre得朝向改变
                        {
                              flag++;
                              pre=s;
                        }
                  }
            }
            flag--;
            printf("%d
",flag);
            if(t)puts("");//输出中间的空行
      }
      return 0;
}
 


原文地址:https://www.cnblogs.com/pangblog/p/3304127.html