hdu 3747 Download

点击打开链接


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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值