栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

map,二分查找,状态压缩,暴力(假硬币)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

map,二分查找,状态压缩,暴力(假硬币)

c++ map,二分查找,状态压缩,暴力(假硬币) 1.map

一个键值对应一个值,值的初始为零

#include 
using namespace std;

int main()
{
    map a;
	//键值为 int ,值也为 int 的一个 map
	
    a[4]=5;
    //键值 4 的值 为 5
	
    //遍历
    for(auto i : a){
        cout << i.first << "t" << i.second << endl;
        // first 为键值  second 为对应的值
    }
    map,int> m;
	//键值两个int 的 map
    return 0;
}

2.二分查找

要查一个数在不在数组里面 , 每次差中间的值 ,小了就看左边,大了就看右边

只能是有序数组才能使用二分查找

递归实现:

int find(int left, int right, int arr[], int k) {
    if (left == right) {
        return arr[left] == k ? left : -1;
    }
    if(arr[(left + right) / 2] < k){
        return find((left + right) / 2 + 1, right, arr, k);
    } else {
        return find(left, (left + right) / 2, arr, k);
    }
}

循环实现:

#include 
using namespace std;

int main()
{
    int arr[] = { 45,56,89,90,132,165 };
    int N = -1, k = 88, left = 0, right = 6;
    while(true) {
        if (left == right) {
            if (arr[left] == k) {
                N = left;
            }
            break;
        }
        if (arr[(left + right) / 2] < k) {
            left = (left + right) / 2 + 1;
        } else {
            right = (left + right) / 2;
        }
    }
    cout << N << endl;

    return 0;
}
3.状态压缩

给定一个字符串 全排列所有的子字符串

长度为n的字符串,求所有子集

状态压缩(递归):

void Compress(int n, char* s, int len, char* subset,int i) {
    if (n == len) {
        subset[i] = '';
        cout << subset << endl;
        return;
    }
    Compress(n + 1, s, len, subset, i);
    subset[i] = s[n];
    Compress(n + 1, s, len, subset, i + 1);
}

状态压缩(循环):

#include 
using namespace std;

int main()
{
    string s = "abcdefg";
    for (int i = 0; i < 128; i++) {
        string subset;
        for (int o = 0, j = i; o < s.length(); o++, j /= 2) {
            if (j % 2 == 1) {
                subset += s[o];
            }
        }
        cout << subset << endl;
    }

    return 0;
}
4.假硬币

暴力模拟,假设第n枚硬币的重量,其他的初始化为0,第 n 枚两种可能 1 或者 -1 再求和与题目给出的条件进行判断即可,如果符合条件直接跳出循环

#include 
using namespace std;

int is_coin(int N, int k) {
    //两个参数 枚举的硬币 枚举的值
    //没有枚举的硬币重量都为 0


    return 0;
}

int main()
{
    int N = 40;
    for (int i = 1; i <= N; i++) {
        //枚举每一枚硬币
        //题目保证有唯一解 所以找到了就直接跳出
        if (is_coin(i, 1)) {
            cout << "第 " << i << " 枚重了" << endl;
            //枚举找到了
            break;
        }
        else if (is_coin(i, -1)) {
            cout << "第 " << i << " 枚轻了" << endl;
            break;
        }
    }

    return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/879831.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号