我是靠谱客的博主 端庄洋葱,最近开发中收集的这篇文章主要介绍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
*/

最后

以上就是端庄洋葱为你收集整理的two point的全部内容,希望文章能够帮你解决two point所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部