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\n",flag);
if(t)puts("");//输出中间的空行
}
return 0;
}