首页 > 其他分享 >周六

周六

时间:2023-05-13 23:23:35浏览次数:30  
标签:int res 整数 ai erase 周六 find

题目描述:

给定一个长为 n 的整数序列 a1, a2, …, an,要求你计算出有多少个区间 [l, r] 满足 max{ai} 与 min{ai} 的差不超过 1。

输入格式:

第一行包含一个整数 n。

第二行包含 n 个整数,表示整数序列。

输出格式:

输出一个整数,表示答案。

数据范围:

1≤n≤105
1≤ai≤109

设计思路:

此题思路还是比较简单的,其主要思路是滑动窗口。窗口范围[l,r]向右移动时,窗口对于最大值和最小值的影响也要随之移动。我们考虑变动右端点r,首先左端点l一定小于等于r,所以我们需要能够快速的找到当前窗口的最大值和最小值。这里考虑用STL中的set函数来解决。

程序流程图:

输入n,a1,a2,..,an
set<int> q;
int res=0;
int j=0;
for(int i=0;i<n;i++){
    while(j<n&&!q.count(a[j])){
        q.insert(a[j]);
        if(*q.rbegin()-*q.begin()>1){
            q.erase(q.find(a[j]));
            break;
        }
        j++;
    }
    res+=j-i;
    q.erase(q.find(a[i]));
}
cout<<res<<endl;

代码实现:

#include<iostream>
#include<set>
using namespace std;

int main()
{
    int n;
    cin>>n;

    int a[n];
    for(int i=0;i<n;i++)
        cin>>a[i];

    set<int>q;
    int res=0;
    int j=0;
    for(int i=0;i<n;i++)
    {
        while(j<n&&!q.count(a[j]))
        {
            q.insert(a[j]);
            if(*q.rbegin()-*q.begin()>1)
            {
                q.erase(q.find(a[j]));
                break;
            }
            j++;
        }
        res+=j-i;
        q.erase(q.find(a[i]));
    }
    cout<<res<<endl;

    return 0;
}

标签:int,res,整数,ai,erase,周六,find
From: https://www.cnblogs.com/zeyangshuaige/p/17398481.html

相关文章

  • 5月6日(周六)
    计划删减代码,把它变成自己的,准备答辩学习前端知识angular框架,html语法扎实的学,css,JavaScript学习后端框架,Java语言学扎实点知道接口怎么回事,尝试或明白一个接口怎么写解决配置文件中resources中的几千个报错,不解决,无意义要搞明白数据库中的字段含义,以了解数据库表如......
  • 2023年4月22日周六
    计划图书馆11点06分主要是考研的英语单词,背诵数学做题和积分部分计网因为偏阅读,多读几章完成初稿最后一部分回顾这一周甚至更前的博客学习记录执行11点10分  英语单词,背诵16点30分  开始看计网不久,打起精神19点02分  吃饭......
  • js 计算时间范围的时间差(只计算工作日,不计算周六周日,精确到天)
    直接上demo代码和截图btnClick(){ varoneDay=1000*60*60*24; vardays=0; //dates是一个时间范围,startDate是时间范围的开始时间,endDate是结束时间 varstartDate=this.dates[0]; varendDate=this.dates[1]; if(endDate.getTime()>0&&startDate.g......
  • 结组训练第五天,周六
    第五天,总结了最难的情况,进行不相交的两天线路的转换,需要中间线路的转换,得到查询输入的起始站和终点站,查询line表,得到二者的Line属性,然后查询changestop表,将得到的Line属性......
  • 周六900C++模拟测试2023.3.18
     2023江南万达校区能力测试说明:1、在桌面以自己名字命名(中文名)建立文件夹;2、文件夹中存储每个题目对应的英文题目名.cpp文件; 中文题目名称小L的能量检测......
  • 2023.2.25周六每日总结
    今天根据b站得javaweb教程学习了两个小时,成功理解了数据库的链接原理,以及connection的使用方法,对不同版本的mysql之间连接的区别有了进一步的理解所以利用jdbc在java中......
  • 周六1900C++班级-2023.2.19-字符串string
    字符串练习使用string定义一个字符串变量strings;字符串是单引号的(×)整行输入字符串有三种方式,分别是gets(),getline(cin,str),cin.getline(str,100)(√)gets是字符数......
  • 周六900C++班级-2023.2.18-栈2
    栈练习2请写出使用stack头文件定义一个名称为q的整型栈_stack<int>q;_____设当前有栈q,元素x,请写出将元素x入栈push的程序q.push(x);设当前有栈q,元素x,请写出出栈pop的......
  • 【Java】取n工作日后的日期(仅排除周六周日)
    importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.time.*;importjava.time.format.DateTimeFormatter;importjava.util.Calendar;i......
  • 周六1900C++班级-2022-11-26-多重循环练习
    比赛链接1001:C语言实验题――素数#include<bits/stdc++.h>usingnamespacestd;intmain(){intans=0;//记录100-200之间素数的个数for(intn=100......