算法实验T5——POJ 2366 Sacrament of the sum

题目链接

题目大意:

 已知两个给定的序列,一个升序排列,一个降序排列,在这两个序列中各找一个数,它们加 起来恰好等于 10000。

思路:

        由有序联想到二分,遍历其中一个序列,对于遍历的每一个数 x,在另一个序列二分搜索(10000 - x),时间复杂度O(nlogn)。

AC代码:

#include<cstdio>
bool check(int val, int l, int r, int *arr){//二分查找
        int mid;
        while(l <= r){
                mid = (l + r) >> 1;
                if(arr[mid] == val){
                        return true;
                }
                if(arr[mid] < val){
                        l = mid + 1;
                }
                else r = mid - 1;
        }
        return false;
}
int main(){
        int arr[50000], x, last_x;
        int size1, size2;
        bool res = false;
        scanf("%d", &size1);
        for(int i = 0; i < size1; i++){
                scanf("%d", &arr[i]);
        }
        scanf("%d", &size2);
        for(int i = 0; i < size2; i++){
                scanf("%d", &x);
                if(i > 0 && x == last_x) continue;//重复的跳过
                if(res) continue;//得把数据读完,所以不能break
                if(check(10000 - x, 0, size1 - 1, arr)){
                        res = true;
                }
                last_x = x;
        } 
        if(res){
                printf("YES");
        }
        else printf("NO");
        return 0;
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值