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 BIO如何下发到HDD?

在Linux操作系统中&#xff0c;当创建一个Block I/O请求&#xff08;BIO&#xff09;时&#xff0c;它会被封装成适合硬件交互的数据结构&#xff0c;并通过内核存储子系统传递到对应的硬件控制器上&#xff0c;如SAS&#xff08;Serial Attached SCSI&#xff09;HBA&#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;读者阅读小说的方式是非线…

力扣0085——最大矩形

最大矩形 难度&#xff1a;困难 题目描述 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵&#xff0c;找出只包含 1 的最大矩形&#xff0c;并返回其面积。 示例1 输入&#xff1a;matrix [["1","0","1","0",&qu…

分布式id-雪花算法

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

2024年项目基金撰写与技巧及GPT融合

详情点击链接&#xff1a;2024年项目基金撰写与技巧及GPT融合 一&#xff1a;国自然项目 1.1项目 1.2接收情况 1.3受理情况 1.4近五年资助情况 1.5国自然改革解读 1.6博后项目 二&#xff1a;基金的撰写技巧 2.1 问题属性与评阅标准 2.2 前期准备工作-如何去选题 2.…

在线商城系统设计

设计一个在线商品商店的数据库模式涉及多个方面&#xff0c;包括产品、订单、用户、支付等。 数据库设计&#xff1a; 用户表 (Users): UserID (主键)用户名密码电子邮件地址电话号码 产品表 (Products): ProductID (主键)产品名称描述价格库存数量分类ID (外键&#xff0c;连接…

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;效率低 我认为使…

JAVA 学习 面试(十)枚举、注解、基本原则

枚举 默认继承 java.lang.Enum 类&#xff0c;不能继承其他父类&#xff0c;并自动添加了values&#xff08;获取枚举类中的所有枚举值&#xff09;和valueOf&#xff08;获取对应的枚举类型&#xff09;方法&#xff0c; java.lang.Enum 类实现了 java.lang.Serializable 和 …

翻译: 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. 绘制您的应…

C++面试:二叉树和红黑树

目录 二叉树 1. 二叉树的定义 2. 二叉树的遍历 3. 二叉树的应用 4. 实现细节 5. C中的实现 面试准备 红黑树 红黑树的原理 红黑树的用途 示例代码 面试准备 1. 红黑树的工作原理及其规则 2. 红黑树的优势及与其他二叉搜索树&#xff08;如AVL树&#xff09;的比较…

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

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

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

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

pyqt添加菜单栏

参考&#xff1a; https://blog.csdn.net/seniorwizard/article/details/109820641 import sys from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtCore import Qt from PyQt5.QtWidgets import (QApplication, QMainWindow, QMenuBar, QMenu, QAction, QPlainTextEdi…