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


  • 相关阅读:
    无线网络技术知识点
    中国高校计算机大赛—网络技术挑战赛
    实验二 软件工程个人项目
    实验一 软件工程准备
    2018年春季软件工程教学设计(初稿)
    2017-2018春季学期软件工程教学资源目录
    2017-2018春季学期软件工程教学纲要
    如何解决Android Studio解决DDMS真机/模拟器无法查看data目录问题
    GitHub的Windows客户端的使用教程
    2017面向对象程序设计(JAVA)课程总结
  • 原文地址:https://www.cnblogs.com/pangblog/p/3304127.html
Copyright © 2020-2023  润新知