题目意思: 有一个人现在想要下载一些东西,现在呢给定一个字符串T表示所以东西的原始状态,1表示打勾,0表示空,现在给定一个字符串S是这个人所要下载的东西的情况,问我么这个最少需要点击几次,这里上面有三个地方第几需要计算 1 全选 2 反选 3 下载东西对应框
解题思路: 我们先来说明一下规律
1: 全选大于等于两次都是和全选一次相同 2:反选一次状态相反,全选两次回到原来效果。(反选奇数次状态相反,反选偶数次不变)
通过上面的规律那么我么知道我么要想最小点击次数,每一种可能的选择都是只点一次即可。
所以就有一下几种点击情况
1:不全选也不反选单个选 2:先全选再单个选 3:先反选在单个选 4先全选再反选再单个选 5 先反选再全选再单个选(其实这个是不用考虑的效果和直接全选一样),所以只要去一一求出取最小值即可
代码:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <cstdio>
#include <stack>
#include <queue>
#include <cmath>
using namespace std;
int n , ans;
char T[55] , S[55];
void solve(){
ans = 999999999;
//1直接单个选
int num = 0;
for(int i = 0 ; i < n ; i++){
if(T[i] != S[i]) num++;
}
if(ans > num) ans = num;
//2全选+单个选
num = 1;
for(int i = 0 ; i < n ; i++){
if(S[i] == '0') num++;
}
if(ans > num) ans = num;
//3反选+单个选
num = 1;
for(int i = 0 ; i < n ; i++){
if(T[i] == '0') T[i] = '1';
else T[i] = '0';
}
for(int i = 0 ; i < n ; i++){
if(T[i] != S[i]) num++;
}
if(ans > num) ans = num;
//4先全选在反选
num = 2;
for(int i = 0 ; i < n ; i++) T[i] = '0';
for(int i = 0 ; i < n ; i++){
if(T[i] != S[i]) num++;
}
if(ans > num) ans = num;
printf("%d\n" , ans);
}
//主函数
int main(){
//freopen("input.txt" , "r" , stdin);
while(scanf("%d" , &n) != EOF){
getchar();//注意换行
gets(T) ; gets(S);
solve();
}
return 0;
}