题目意思: 有一个人现在想要下载一些东西,现在呢给定一个字符串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; }