C++算法之枚举、模拟与排序

1.AcWing 1210.连号区间数

分析思路

由题意是在 1∼N 的某个排列中有多少个连号区间,所以每个数出现并且不重复!

如果是连续的,那么Max-Min==j-i([i,j])

代码实现
#include<iostream>
#include<algorithm>
using namespace std;
const int N=10010,INF = 100000000;
int a[N];
int main()
{int n;cin>>n;int count=0;for(int i=0;i<n;i++) cin>>a[i];for(int i=0;i<n;i++)//枚举区间的左端点{int Max=-INF,Min=INF;for(int j=i;j<n;j++)//枚举区间的右端点{Max=max(Max,a[j]);Min=min(Min,a[j]);if(Max-Min==j-i) count++;}}cout<<count<<endl;return 0;
}

2.AcWing 1236.递增三元组

分析思路

由题意可知,需要从A、B、C数组中各取一个,使得A<B<C,所以我们来枚举B数组(由于时间复杂度的限制只能枚举一个数组),这样A,C是独立的互不影响的,只与B数组的大小有关,然后从A中找到小于B的个数、从C中找到大于B的个数,两者相乘。

排序+二分:先对A、C数组进行排序然后用二分求出A中小于B的第一个个数的位置和C中大于B的第一个位置。
前缀和:

代码实现

排序+二分:

#include<iostream>
#include<algorithm>using namespace std;
const int N=100010;
typedef long long LL;
int a[N],b[N],c[N];int main()
{int n;cin>>n;for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);for (int i = 1; i <= n; i ++ ) scanf("%d", &b[i]);for (int i = 1; i <= n; i ++ ) scanf("%d", &c[i]);sort(a+1,a+n+1);sort(c+1,c+n+1);LL res=0;for(int i=1;i<=n;i++){int l=1,r=n;while(l<r){int mid=(l+r+1)/2;if(a[mid]<b[i]) l=mid;else r=mid-1;}if (a[l] < b[i]) {int temp=l;l=1,r=n;while(l<r){int mid=(l+r)/2;if(c[mid]>b[i]) r=mid;else l=mid+1;}if(c[r]>b[i]) res+=(LL)(temp)*(LL)(n-l+1);}}cout<<res<<endl;return 0;
}

前缀和:

3个数组的所有数都加1,是因为在不影响数与数之间的大小关系下,让该行代码s[b[i] - 1];

避免出现b[i]为0的情况导致空指针异常

#include<iostream>
#include<algorithm>using namespace std;
const int N=100010;
typedef long long LL;
int a[N],b[N],c[N],s[N],t[N],x[N],y[N];int main()
{int n;cin>>n;for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]),a[i]++;for (int i = 1; i <= n; i ++ ) scanf("%d", &b[i]),b[i]++;for (int i = 1; i <= n; i ++ ) scanf("%d", &c[i]),c[i]++;LL res=0;for(int i=1;i<=n;i++){s[a[i]]++;t[c[i]]++;}for(int i=1;i<=N;i++){x[i]=x[i-1]+s[i];y[i]=y[i-1]+t[i];}for(int i=1;i<=n;i++){res+=(LL)(x[b[i]-1])*(LL)(y[N]-y[b[i]]);}cout<<res<<endl;return 0;
}

3.AcWing 1245.特别数的和

分析思路

每次取出个位数判断是否满足要求即可!

字符型数组转化成整型:

 int x=0;

for(int i=0;i<s.size();i++)

{

        x=x*10+s[i]-'0';

}

代码实现
#include<iostream>using namespace std;
int main()
{int n;cin>>n;int res=0;for(int i=1;i<=n;i++){int x=i;while(x){int t=x%10;//取个位数x/=10;//去掉个位if(t==1||t==2||t==0||t==9) {res+=i;break;//只要存在指定数字结束本次循环}}}cout<<res<<endl;return 0;
}

4.AcWing 1204. 错误票据

分析思路

先对数组进行排序操作,然后遍历如果存在前一个和后一个相等则为重号ID,如果存在当a[i]>=a[i-1]+2,则两者之前存在缺失ID即a[i]-1。

代码实现
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>using namespace std;const int N = 10010;int n;
int a[N];int main()
{int cnt;cin >> cnt;string line;getline(cin, line); // 忽略掉第一行的回车while (cnt -- ){getline(cin, line);stringstream ssin(line);while (ssin >> a[n]) n ++ ;}sort(a, a + n);int res1, res2;for (int i = 1; i < n; i ++ )if (a[i] == a[i - 1]) res2 = a[i];  // 重号else if (a[i] >= a[i - 1] + 2) res1 = a[i] - 1; // 断号cout << res1 << ' ' << res2 << endl;return 0;
}

还可以使用以下代码对数组进行读入:

int x, i = 0;cin >> x;//过滤while(cin >> x) a[i++] = x;

5.AcWing 466.回文日期

分析思路

①枚举回文数(年份的范围是在1000~10000)

先枚举前四位,然后算出八位数的日期

int res=0;for(int i=1000;i<10000;i++){int r=i,x=i;//形成八位数的日期for(int i=0;i<4;i++) r=r*10+x%10,x/=10;if(r>=date1&&r<=date2&&check(r)) res++;}

②判断是否在范围内

③判断日期是否合法

先开一个每个月份天数的集合,先判断月份(除二月之外)、天数是否满足,然后根据平年闰年对二月的天数进行讨论(平年-28天 闰年-29天)

bool check(int data)
{int year=data/10000;int month=data%10000/100;int day=data%100;if(!month||month>12||!day) return false;if(month!=2&&day>days[month]) return false;if(month==2){bool flag=year%100&&year%4==0||year%400==0;if(day>28+flag)//如果是闰年则二月是29天需要+100return false;}return true;
}
代码实现
#include<iostream>
#include<algorithm>using namespace std;
int days[13]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool check(int data)
{int year=data/10000;int month=data%10000/100;int day=data%100;if(!month||month>12||!day) return false;if(month!=2&&day>days[month]) return false;if(month==2){bool flag=year%100&&year%4==0||year%400==0;if(day>28+flag)//如果是闰年则二月是29天需要+100return false;}return true;
}
int main()
{int date1,date2;cin>>date1>>date2;int res=0;for(int i=1000;i<10000;i++){int r=i,x=i;//形成八位数的日期for(int i=0;i<4;i++) r=r*10+x%10,x/=10;if(r>=date1&&r<=date2&&check(r)) res++;}cout<<res<<endl;return 0;
}

6.AcWing 2867.回文日期(蓝桥杯真题)

分析思路

在上一题的基础上加上对回文日期的判断(双指针方法)AB型日期的特判

代码实现
#include<iostream>
#include<algorithm>using namespace std;
int days[13]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool check(int data)
{int year=data/10000;int month=data%10000/100;int day=data%100;if(!month||month>12||!day) return false;if(month!=2&&day>days[month]) return false;if(month==2){bool flag=year%100&&year%4==0||year%400==0;if(day>28+flag)//如果是闰年则二月是29天需要+100return false;}return true;
}
bool check1(string data)
{int l=data.length();for(int i=0,j=l-1;i<j;i++,j--){if(data[i]!=data[j]) return false;}return true;
}
bool check2(string data)
{if(check1(data)){if(data[0]!=data[1]&&data[2]==data[0]&&data[3]==data[1]) return true;else return false;}
}
int main()
{int date1;int flage=0;cin>>date1;int res1=0,res2=0;for(int i=date1+1;i<=99999999;i++){if(check(i)){string s=to_string(i);if(check1(s)&&!flage)//回文判断{res1=i;flage=1;} if(check2(s))//回文特判{res2=i;break;}}}cout<<res1<<endl;cout<<res2<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/651568.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于AOP的@Around特殊处理RequestBody的使用小结

目录 1. 概述 1.1 背景 1.2 源码 2. 测试 2.1 Controller 2.2 SpecialName配置 2.3 RequestConverter 2.4 测试 最近项目上遇到一个这样的需求&#xff1a;用户请求的时候传过来A&#xff0c;在api处理过程中要把A当成B去处理&#xff0c;但是返回的标识中又必须是A作为…

freeswitch智能外呼系统搭建流程

1.获取实时音频数据 media_bug &#xff08;好多mrcp方式也崩溃所以用以下方式&#xff09; 可以参考 方式可以通过socket或者webscoket freeswitch[1.05]用websocket发送mediabug语音流到ASRProxy实现实时质检和坐席辅助 - 知乎 2.webscoket 好多c的库放模块容易崩溃 可以…

2. MySQL 多实例

重点&#xff1a; MySQL 的 三种安装方式&#xff1a;包安装&#xff0c;二进制安装&#xff0c;源码编译安装。 MySQL 的 基本使用 MySQL 多实例 DDLcreate alter drop DML insert update delete DQL select 2.5&#xff09;通用 二进制格式安装 MySQL 2.5.1&#xff…

Linux ---- Shell编程之函数与数组

目录 一、函数 1、函数的基本格式 2、查看函数列表 3、删除函数 4、函数的传参数 5、函数返回值 实验&#xff1a; 1.判断输入的ip地址正确与否 2. 判断是否为管理员用户登录 6、函数变量的作用范围 7、函数递归&#xff08;重要、难点&#xff09; 实验&#xff1…

《Q年文峰》GPT应用的交互式非线性体验

Phoncent博客创始人庄泽峰把自己的小说《Q年文峰》做成GPT应用&#xff0c;显然这是一件值得探索且具有创新意义的事情。 因为传统的阅读体验是线性的&#xff0c;读者只能按照固定的情节顺序进行阅读&#xff0c;而把小说制作成GPT应用后&#xff0c;读者阅读小说的方式是非线…

分布式id-雪花算法

一、雪花算法介绍 Snowflake&#xff0c;雪花算法是有Twitter开源的分布式ID生成算法&#xff0c;以划分命名空间的方式将64bit位分割成了多个部分&#xff0c;每个部分都有具体的不同含义&#xff0c;在Java中64Bit位的整数是Long类型&#xff0c;所以在Java中Snowflake算法生…

203.移除链表元素(力扣LeetCode)

文章目录 203.移除链表元素题目描述原链表删除元素虚拟头节点 203.移除链表元素 题目描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head …

Ubuntu20.04添加桌面启动、侧边栏启动和终端启动

桌面启动 新建XX.desktop文件 在桌面新建一个XX.desktop文件&#xff0c;以QtCreator为例。 &#xff08;注意这里不能使用sudo&#xff0c;因为这样会把文件的权限归为root&#xff0c;导致后续设置可执行程序不方便&#xff09; gedit qtcreator.desktop在XX.desktop文件中…

【DeepLearning-9】YOLOv5模型网络结构中加入MobileViT模块

一、神经网络的前中后期 在神经网络中&#xff0c;特别是在深度卷积神经网络&#xff08;CNN&#xff09;中&#xff0c;“网络早期&#xff08;低层&#xff09;”、“网络中期&#xff08;中层&#xff09;”和“网络后期&#xff08;高层&#xff09;”通常指的是网络结构中…

【云原生】初识Docker,安装以及了解操作命令

一、为什么要使用容器&#xff1f; 背景&#xff1a;以前开发、测试、生产为不同的环境&#xff0c;痛点是发现开发测试以后没问题&#xff0c;但是在生产环境无法运行。给测试、开发、运维人员造成了大量的工作。最终结果是发版更新速度也跟不上&#xff0c;效率低 我认为使…

翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式二

GPT-4 Vision 系列: 翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式一 GPT-4 Vision 的 7 个实际用例 Pre-requisites:先决条件&#xff1a; 订阅 ChatGPT Plus 以访问 GPT-4 Vision。如果您不熟悉 Streamlit&#xff0c;请按照安装步骤操作。 1. 绘制您的应…

尚无忧球馆助教系统源码,助教小程序源码,助教源码,陪练系统源码

特色功能&#xff1a; 不同助教服务类型选择 助教申请&#xff0c;接单&#xff0c;陪练师入住&#xff0c;赚取外快 线下场馆入住 设置自己服务 城市代理 分销商入住 优惠券 技术栈&#xff1a;前端uniapp后端thinkphp 独立全开源

.NET高级面试指南专题一【委托和事件】

在C#中&#xff0c;委托&#xff08;Delegate&#xff09;和事件&#xff08;Event&#xff09;是两个重要的概念&#xff0c;它们通常用于实现事件驱动编程和回调机制。 委托定义&#xff1a; 委托是一个类&#xff0c;它定义了方法的类型&#xff0c;使得可以将方法当作另一个…

HarmonyOS鸿蒙ArkTS,封装http网络请求

HarmonyOS鸿蒙ArkTS&#xff0c;封装http网络请求 前提&#xff1a; 要想使用http请求&#xff0c;系统必须要具备ohos.permission.INTERNET权限&#xff0c;在model.json5文件中的module模块下添加如下请求权限&#xff1a; 在module.json5文件中 配置 "requestPermi…

LeetCode 热题 100 | 矩阵

目录 1 73. 矩阵置零 2 54. 螺旋矩阵 3 48. 旋转图像 4 240. 搜索二维矩阵 II 菜鸟做题第二周&#xff0c;语言是 C 1 73. 矩阵置零 解题思路&#xff1a; 遍历矩阵&#xff0c;寻找等于 0 的元素&#xff0c;记录对应的行和列将被记录的行的元素全部置 0将被记录的…

k8s 进阶实战笔记 | Scheduler 调度策略总结

文章目录 Scheduler 调度策略总结调度原理和过程调度策略nodeSelect亲和性和反亲和性NodeAffinify亲和验证PodAffinity 亲和验证PodAntiAffinity 反亲和验证污点与容忍跳过 Scheduler 调度策略 调度策略场景总结 Scheduler 调度策略总结 调度原理和过程 Scheduler 一直监听着…

【心得】java JNDI配合RMI实现注入个人笔记

目录 JNDI RMI 基本概念 RMI 基本逻辑 恶意利用 JNDI注入RMI实现攻击 JNDI Java Naming and Directory Interface Java 命令和目录接口 让配置参数 和 代码 解耦的规范或者思想 低耦合 高内聚 Name 命名 java对象 通过 命名 绑定到 容器环境 java对象和一个特定的…

REVIT二次开发万能刷

将这两个参数赋予其他参数 步骤2 将来做个可以调控的版本 using System; using System.Collections.Generic; using System.Lin

华为机考入门python3--(4)牛客4-字符串分隔

分类&#xff1a;字符串 知识点&#xff1a; 复制符号* 复制3个0 0*3 000 字符串截取 截取第i位到j-1位 str[i:j] 题目来自【牛客】 input_str input().strip()# 先补齐 if len(input_str) % 8 ! 0: input_str 0 * (8 - len(input_str) % 8) # 每8个分 out…

uniapp微信小程序-请求二次封装(直接可用)

一、请求封装优点 代码重用性&#xff1a;通过封装请求&#xff0c;你可以在整个项目中重用相同的请求逻辑。这样一来&#xff0c;如果 API 发生变化或者需要进行优化&#xff0c;你只需在一个地方修改代码&#xff0c;而不是在每个使用这个请求的地方都进行修改。 可维护性&a…