win2008r2 iis配置网站小企业网站建设查询
win2008r2 iis配置网站,小企业网站建设查询,婚纱网站策划书,云南网站设计定制一、枚举的定义与核心思想
定义#xff1a;枚举算法#xff08;暴力枚举#xff09;是一种通过列举所有可能的解#xff0c;并检查每个解是否满足问题要求来求解问题的方法。
核心思想#xff1a;不重复、不遗漏地列出所有可能情况。
下面通过几个题目来解释枚举算法。…一、枚举的定义与核心思想定义枚举算法暴力枚举是一种通过列举所有可能的解并检查每个解是否满足问题要求来求解问题的方法。核心思想不重复、不遗漏地列出所有可能情况。下面通过几个题目来解释枚举算法。二、普通枚举铺地毯题目来源于洛谷题目描述思路采用逆序查找方式进行查找正确的地毯编号如果使用正序查找则第一次查找到的地毯不一定是最上面的地毯判断所求坐标是否在地毯内部包含边界。横坐标的值必须满足 a x a g纵坐标的值必须满足 b y b k同时成立则在地毯内部-----返回地毯编号否则返回-1代码#includeiostream using namespace std; const int N 1e4 10; //定义四个数组用于存放横坐标纵坐标x、y方向的长度 int a[N],b[N],g[N],k[N]; int find(int x, int y, int n){ //逆序遍历地毯 for(int i n; i 1; i--){ //(x,y)必须在(a,b)~(a g, b k)范围内 if(x a[i] y b[i] x a[i] g[i] y b[i] k[i]){ return i; } } return -1; } int main(){ int n; cinn; //输入每个地毯对应的信息 for(int i 1; i n; i){ cina[i]b[i]g[i]k[i]; } //输入所求的地面的点的坐标x,y int x,y; cinxy; //查找所对应的地毯的编号 int num find(x,y,n); coutnumendl; return 0; }回文日期题目来源于洛谷题目描述思路将输入的两个数字分别把开始日期和结束日期所有对应的年、月、日计算出来。初始化回文日期的数量为0。保证开始日期不晚于结束日期的情况下遍历每一天的日期是否为回文日期。将日期所对应的数字转换为字符串。遍历前一半字符判断是否满足回文日期的要求一个 8 位数字是回文的当且仅当对于所有的 i1≤i≤8从左向右数的第 i 个数字和第 9−i 个数字即从右向左数的第 i 个数字是相同的。如果满足要求则计数器加1并指向下一天。指向下一天的时候需要注意边界情况即每个月的最后一天和每年的最后一天这里需要先求出每个月所对应的天数。如果到达每个月的最后一天则下一天就应把天数置为1月份加1。如果到达一年的最后一天则下一天就应把月份置为1年份加1。代码#includeiostream #includestring using namespace std; //判断是否是闰年 bool isLeap(int year){ //是4的整数倍但不是 100 的整数倍或者是400的整数倍。 if((year % 4 0 year % 100 ! 0) || (year % 400 0)){ return true; } return false; } //获取某年某月的天数 int dayInMonth(int year, int month){ if(month 2){ if(isLeap(year) true){ return 29; } return 28; }else if(month 4 || month 6 || month 9 || month 11){ return 30; }else{ return 31; } } //判断是否为回文日期 bool isPailindrome(int date){ //将数字装换为字符串 string s to_string(date); int len s.length(); for(int i 0; i len / 2; i){ //不相等返回false if(s[i] ! s[len - i - 1]){ return false; } } return true; } int main(){ //输入两个日期 int start,end; cinstartend; //输入日期转换为年月日 int year start / 10000; int month (start / 100) % 100; int day start % 100; int endYear end / 10000; int endMonth (end / 100) % 100; int endDay end % 100; //用于存储回文日期的数量 int cnt 0; //保证开始日期不晚于结束日期-----(不同年同年不同月同年同月不同日) while(year endYear || (year endYear month endMonth) || (year endYear month endMonth day endDay)){ //从第一天开始遍历 int current year * 10000 month * 100 day; //调用判断回文日期的函数----如果是回文日期则计数器加1 if(isPailindrome(current) true){ cnt; } day; //如果天数大于月份内应有的天数-则天数置为1月份加1 if(day dayInMonth(year,month)){ day 1; month; //如果月份大于12-则月份置为1年份加1 if(month 12){ month 1; year; } } } coutcntendl; return 0; }三、二进制枚举二进制枚举的定义用一个数二进制表示中的 0/1 表示两种状态从而达到枚举的效果。二进制枚举中肯呢个会用到位运算的知识-----可以查看此链接https://blog.csdn.net/2301_79932175/article/details/157360586例题子集题目来源于力扣题目描述思路对于长度为 n的数组每个元素有“选”或“不选”两种状态。用二进制数表示选择情况从0到的每个整数对应一个子集其中第 i 位为 1 表示选取第 i 个元素。遍历所有状态根据二进制中表示1的位置把对应的数选出来。图解代码class Solution { public: vectorvectorint subsets(vectorint nums) { int n nums.size(); vectorvectorint res; // 枚举所有状态从 0 到 (1n)-1 for (int mask 0; mask (1 n); mask) { //根据mask的状态还远处要选的数 vectorint tmp; // 存当前选的子集 // 检查每一位 for (int i 0; i n; i) { if (mask (1 i)) { // 第 i 位为 1选取 nums[i] tmp.push_back(nums[i]); } } res.push_back(tmp); } return res; } };四、总结枚举算法是算法学习的基础它简单直接但效率较低。