I and OI
Past...

题意:给出N个递增的数ai,M个递减的数bi.求是否存在一对ai,bj使得ai+bj=10000.

分析:N<=50000,N^2效率一定不行了.看到a,b数列均单调,这可以加速.

设置一个指针i指向a,j指向b.

初始i=1,j=1.

若ai+bj>10000,那么肯定bj+ai'(i'>i)都不等于10000,因为ai递增.所以j=j+1.

同理,若ai+bj<10000,i=i+1.

这个方法很有用,要记下.

code(无聊地写了C++):

#include<iostream>
using namespace std;
int a[51000],b[51000];

int main()
{
    int i,j,n,m;
    bool flag;
    scanf("%d",&n);
    for (i=1;i<=n;i++) scanf("%d\n",&a[i]);
    scanf("%d",&m);
    for (j=1;j<=m;j++) scanf("%d\n",&b[j]);
    i=1;
    j=1;
    flag=0;
    while (i<=n&&j<=m)
    {
         if (a[i]+b[j]==10000) {flag=1; break;}
         if (a[i]+b[j]<10000) i++;
         if (a[i]+b[j]>10000) j++; 
    }
    if (flag) printf("YES\n");
    else printf("NO\n");
    return 0;
}
posted on 2011-08-12 16:55  exponent  阅读(412)  评论(0编辑  收藏  举报