首页 > 编程语言 >《算法竞赛》---三指针

《算法竞赛》---三指针

时间:2024-01-10 17:25:34浏览次数:27  
标签:cout int cin long --- 算法 tie include 指针

----双指针(尺取法)

1.找出指定和的整数对----p37(书页)

哈希表

#include<bits/stdc++.h>
using namespace std;
int a[100010];
int main()
{
    ios::sync_with_stdio(false);cin.tie();cout.tie();
    unordered_map<int,bool>q;
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {cin>>a[i];q[a[i]]=true;}
     for(int i=1;i<=n;i++)
     {
         int x=m-a[i];
         if(q[x]{cout<<a[i<<''<<x<<endl;q[x]=false,q[a[i]]=false;}
     }
    return 0;
}

双指针(尺取法---反向扫描)

#include<bits/stdc++.h>
using namespace std;
int a[100010];
int main()
{
    ios::sync_with_stdio(false);cin.tie();cout.tie();
    unordered_map<int,bool>q;
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    sort(a+1,a+1+n);
    int l=1,r=n;
    while(l<r)
    {
        if(a[l]+a[r]<m)
         l++;
         else if(a[l]+a[r]>m)
         r--;
         else {cout<<a[l]<<' '<<a[r]<<endl;l++,r--;}
    }
    return 0;
}

二分

#include<bits/stdc++.h>
using namespace std;
int a[100010];
bool vis[1000000000];
int main()
{
    ios::sync_with_stdio(false);cin.tie();cout.tie();
    //unordered_map<int,bool>q;
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    sort(a+1,a+1+n);
      for(int i=1;i<=n;i++)
      {
          int x=m-a[i];
          int g=lower_bound(a+1,a+1+n,x)-a;
          if(g>=1&&g<=n&&!vis[a[i]]&&a[i]+a[g]==m)
          {cout<<a[i]<<' '<<a[g]<<endl;vis[x]=true;}
      }
    return 0;
}

双指针(尺取法---同向扫描)

2.判断回文串-------p38

stl大法好(reverse翻转判断)

#include<bits/stdc++.h>
using namespace std;
int a[100010];
bool vis[1000000000];
int main()
{
    ios::sync_with_stdio(false);cin.tie();cout.tie();
    int t;
    cin>>t;
    while(t--)
    {
        string a,b;
        cin>>a;
        b=a;
        reverse(a.begin(),a.end());
        if(a==b)cout<<"yes\n";
        else cout<<"no"<<endl;
    }
    return 0;
}

双指针(反向扫描)

#include<bits/stdc++.h>
using namespace std;
int a[100010];
bool vis[1000000000];
int main()
{
    ios::sync_with_stdio(false);cin.tie();cout.tie();
    int t;
    cin>>t;
    while(t--)
    {
     string a;
        cin>>a;
    int l=0,r=a.size()-1;
        bool df=true;
    while(l<r)
     {
         if(a[l]!=a[r])
         {cout<<"no\n";df=0;break;}
         else l++,r--;
     }
         if(df)
        cout<<"yes\n";
    }
    return 0;
}

3.寻找区间和----p39

双指针(快慢指针---同向扫描)


#include<bits/stdc++.h>
using namespace std;
int a[100010];
//bool vis[1000000000];
int main()
{
    ios::sync_with_stdio(false);cin.tie();cout.tie();
    int n,m;
    cin>>n>>m;
    for(int i=0;i<=n-1;i++)cin>>a[i];
  //  sort(a+1,a+1+n);
    int l=0,r=0,sum=a[0];
    while(r<n)
    {
        //int sum=a[l]
        if(sum>=m)
        {
            if(sum==m)cout<<l<<' '<<r<<endl;
            sum-=a[l];
            l++;
            if(l>r){sum=a[l];r++;}
        }
        else 
        {
            r++;sum+=a[r];
        }
    }
    return 0;
}

4.多指针

找相同数对----p41

1.哈希法unordered_map

#include<iostream>
using namespace std;
long long n,c,cnt;
#include<unordered_map>
unordered_map<int,int>p;
int a[300000];
int main()
{
    ios::sync_with_stdio(false);cin.tie();cout.tie();
    cin>>n>>c;
    for(int i=1;i<=n;i++){cin>>a[i];p[a[i]]++;}
    for(int i=1;i<=n;i++)
    {
        int x=a[i]+c;
        if(p[x])cnt+=p[x];
        if(x==a[i])cnt--;
       // cout<<cnt<<endl;
      //  cout<<cnt<<endl;
    }
    cout<<cnt;
    return 0;
}

2.多指针

//三指针区间算法
#include<bits/stdc++.h>
using namespace std;
long long n,c,cnt;
#include<unordered_map>
//unordered_map<int,int>p;
int a[4000000];
int main()
{
    ios::sync_with_stdio(false);cin.tie();cout.tie();
    cin>>n>>c;
    for(int i=1;i<=n;i++)cin>>a[i];
    sort(a+1,a+1+n);
    for(int i=1,j=1,k=1;i<=n;i++)
    {
        while(a[j]-a[i]<c&&j<=n)j++;//不能等号因为最后一次j+会使得a[j]-a[i]>=c
        while(a[k]-a[i]<=c&&k<=n)k++;
        if(a[j]-a[i]==c&&a[k-1]-a[i]==c&&k-1>1)cnt+=k-j;//[j,k)内部为相等元素
    }
    cout<<cnt;
    return 0;
}

最短连续区间和-----p42(poj 3061)

双指针+贪心

//构造一个窗口
#include<iostream>
using namespace std;
long long n,s,cnt;
int a[4000000];
int main()
{
    ios::sync_with_stdio(false);cin.tie();cout.tie();
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n>>s;
    for(int i=1;i<=n;i++)cin>>a[i];
    cnt=n+1;
   long long l=1,r=1;
    long long sum=0;
   while(1)
  {
      while(sum<s&&r<n)sum+=a[r++];//使得r每次多走一个
      if(sum<s)break;//核心操作
      cnt=min(cnt,r-l);//r实际使窗口外的[l,r)
      sum-=a[l++];
  }
   if(cnt==n+1)cout<<"0\n";
   else cout<<cnt<<'\n';
    }
    return 0;
}

标签:cout,int,cin,long,---,算法,tie,include,指针
From: https://www.cnblogs.com/yuexiabaobei/p/17956912

相关文章

  • 《算法竞赛》---二分
    整数二分经典模型1.最大值最小化(最大值尽量小)序列划分-----p48#include<bits/stdc++.h>usingnamespacestd;intn,k;//longlongsum;inta[1000000];boolcheck(intx){longlongres=0,cnt=0;res=a[1];for(inti=2;i<=n;i++){if(res+a[i]<......
  • 《算法竞赛》---搜索
    搜索二叉树搜索bfs搜索二叉树---p98#include<bits/stdc++.h>usingnamespacestd;constintN=1e5;intn;chara[100000];structnode{charvalue;intlson,rson;}tree[N];intidx=1;intnewnode(charval){tree[idx].value=val,tree[idx].lson=0,tre......
  • rm -rf dir删除不了的几种情况
    我勒个去!root用户通过rm-rf竟无法删除文件了!原创 浩道 浩道Linux 2024-01-0907:50 发表于广东关注上方浩道Linux,回复资料,即可获取海量Linux、Python、网络通信、网络安全等学习资料!前言大家好,这里是浩道Linux,主要给大家分享Linux、Python、网络通信、网络安全等相......
  • AP8854 宽压降压电源管理芯片12-80V 7v2.5A 应用于电动车手暖套的PBC线路
    AP8854一款宽电压范围降压型DC-D电源管理芯片,内部集成使能开关控制、基准电源、误差放大器、过热保护、限流保护、短路保护等功能,非常适合宽电压输入降压使用。AP8854带使能控制,可以大大节省外围器件,更加适合电池场合使用,具有很高的方案性价比。产品特点:电压输入范围10V至......
  • 张正友棋盘代码-python
    具体实现方案:棋盘是一块由黑白方块间隔组成的标定板,我们用它来作为相机标定的标定物(从真实世界映射到数字图像内的对象)。之所以我们用棋盘作为标定物是因为平面棋盘模式更容易处理(相对于复杂的三维物体),但与此同时,二维物体相对于三维物体会缺少一部分信息,于是我们会多次改变棋盘的......
  • php入门学习-2
    运算符与优先级  php的运算符分为:算术运算符,字符串运算符,赋值运算符,位运算符,条件运算符,逻辑运算符等。  当各种运算符同在一个表达式中时,运算是有一定优先级的。  1.算术运算符  + 加法  - 减法  * 乘法  / 除法  % 求余......
  • Spark 框架模块和Spark的运行模式 -
    整个Spark框架模块包含:SparkCore、SparkSQL、SparkStreaming、SparkGraphX、SparkMLlib,而后四项的能力都是建立在核心引擎之上SparkCore:Spark的核心,Spark核心功能均由SparkCore模块提供,是Spark运行的基础。SparkCore以RDD为数据抽象,提供Python、Java、Scala、R语......
  • 【服务器数据恢复】虚拟机文件丢失导致Hyper-V服务瘫痪,虚拟机无法使用的数据恢复案例
    服务器数据恢复环境:WindowsServer操作系统服务器,部署Hyper-V虚拟化环境,虚拟机的硬盘文件和配置文件存放在某品牌MD3200存储中,MD3200存储中有一组由4块硬盘组成的raid5阵列,存放虚拟机的数据文件;另外还有一块硬盘存放虚拟机数据文件的备份。服务器故障&检测:由于MD3200存储中虚拟......
  • 迅为iTOP-3568开发板助力实时系统,Preemption与Xenomai
    iTOP-RK3568开发板使用手册上新,后续资料会不断更新,不断完善,帮助用户快速入门,大大提升研发速度。iTOP-RK3568开发板支持了Preemption和Xenomai实时系统。实时系统以其卓越的实时性能,为用户提供出色的体验,《iTOP-3568开发板实时系统使用手册》将对实时系统的选择、编译烧写、测试等方......
  • Oracle-概要文件dba_profiles(资源配置)
    DBA_PROFILES用来显示所有配置文件及其限制。在11g数据库环境中,dba_profiles的结构只有4个字段,分别是PROFILE\RESOURCE_NAME\RESOURCE_TYPE\LIMIT;在12c及以上的Oracle数据库中,新增了COMMON\INHERITED\IMPLICIT。1.通过select语句查看所有配置及限制。select*fromdba_profil......