题目链接:http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1303
题目描述:
1303.田教主的卡片
Time Limit: 1000 MS
Memory Limit: 65536 K
Total Submissions: 304 (122 users) Accepted: 129 (106 users)
[ My Solution ]
Total Submissions: 304 (122 users) Accepted: 129 (106 users)
[ My Solution ]
Description
由于大四课比较少,无聊的田教主开始研究起01串来了,说是要给积分赛出关于01串的题目。不过令人惊讶的是他居然拿出了n张自制的卡片,且在每张卡片的一面写上了数字0,另一面写上了数字1,并将这n张卡片放置在桌上排成一排。这样,借助这些卡片,田教主开始构思他的01串题目了。大家知道thinkpoet是很菜的菜鸟,得知这个消息后,作为菜鸟的thinkpoet自然想去膜拜田教主,向他请教关于某个01串的题目。当向thinkpoet讲解到一半的时候,田教主需要以这n张卡片作为示例来辅助讲解。但是首先他要做的是将所有这些卡片朝上的数字都弄成相同。田教主的一次操作可以将一段连续范围的卡片都翻转过来。thinkpoet想知道田教主最少需要几次操作,才能把这n张卡片朝上的数字都弄成相同。
Input
第一行为一个整数T(T<=30),表示输入数据组数。
对于每一组数据,第一行为一个整数n(n<=100),表示有n张卡片。接下来一行有一个长度为n的01串,表示这n张卡片的初始摆放情况。
对于每一组数据,第一行为一个整数n(n<=100),表示有n张卡片。接下来一行有一个长度为n的01串,表示这n张卡片的初始摆放情况。
Output
对于每组输入,每行输出田教主所需的最少操作次数。
Sample Input
2
5
00110
9
001100111
5
00110
9
001100111
Sample Output
1
2
2
Source
thinkpoet @ xmu
思路:大水题一道;首先枚举出全部变成1需要几次,然后枚举出全部变成0需要几次,再比较,选出小的,就是答案。
代码:
#include <stdio.h>
#include <string.h>
int main()
{
int i,j,m,n;
char a[1000],b[1000];
int min,t;
while(scanf("%d",&m)!=EOF)
{
while(m--)
{
scanf("%d",&n);
scanf("%s",a);
strcpy(b,a);
t=0;
for(i=0;i<n;i++)
{
if(a[i]=='0')
{
t++;
for(;a[i]=='0'&&i<n;i++)
a[i]='1';
i--;
}
}
min=t;
t=0;
for(i=0;i<n;i++)
{
if(b[i]=='1')
{
t++;
for(;b[i]=='1'&&i<n;i++)
b[i]='0';
i--;
}
}
if(t<min)
min=t;
printf("%d\n",min);
}
}
return 0;
}