zoukankan      html  css  js  c++  java
  • two point

    名字是zhw起的。
    有这样一个问题:
    这里写图片描述
    解法:
    利用两个指针,其中一个从前往后扫a数组,另一个从后往前扫b数组,先固定其中一个,另一个来扫
    用可能成为最大值的数来更新答案。
    具体看代码吧:

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    int n,p,ans;
    int a[100009],b[100009];
    int main()
    {
        scanf("%d%d",&n,&p);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        for(int i=1;i<=n;i++) scanf("%d",&b[i]);
        int t1=1,t2=n;
        while(t1<=n&&t2>=1)
        {
            while(a[t1]+b[t2]>p&&t2>=1) t2--;
            ans=max(ans,a[t1]+b[t2]);
            t1++;
        }
        printf("%d",ans);
        return 0;
    } 

    这里写图片描述
    解法:对a,b数组用two point,同时求c,d的最大前缀和(即前面的最大的那个数),不断更新答案。
    代码:

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cstdio>
    #define M 100009
    using namespace std;
    int n,p,ans;
    int a[M],b[M],c[M],d[M];
    int main()
    {
        scanf("%d%d",&n,&p);
        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]);
        for(int i=1;i<=n;i++) scanf("%d",&d[i]);
        for(int i=1;i<=n;i++) c[i]=max(c[i],c[i-1]),d[i]=max(d[i],d[i-1]);//前缀最大值    
        int t1=1,t2=n;
        while(t1<=n&&t2>=1)
        {
            while(a[t1]+b[t2]>p&&t2>=1) t2--;
            ans=max(ans,c[t1]+d[t2]);
            t1++;
        } 
        printf("%d",ans);
        return 0;   
    }
    /*
    5 9
    1 2 3 4 5
    1 3 5 7 9
    5 6 7 9 8
    1 2 50 100 10
    */
  • 相关阅读:
    Mysql集群
    JAVA 经典算法 40 例
    公司面试问题总结
    面试题6
    面试题5
    Java自学-JDK环境变量配置
    mybatis中#{}和${}的区别
    JVM系列(四)— 原子性、可见性与有序性
    JVM系列(三)— Java内存模型
    Java基础拾遗(一) — 忽略的 Integer 类
  • 原文地址:https://www.cnblogs.com/dfsac/p/7587898.html
Copyright © 2011-2022 走看看