C语言排序(12)___Can you find it?(Hdu 2141)

Problem Description

Give you three sequences of numbers A, B, C, then we give you a number X. Now you need to calculate if you can find the three numbers Ai, Bj, Ck, which satisfy the formula Ai+Bj+Ck = X.

Input

There are many cases. Every data case is described as followed: In the first line there are three integers L, N, M, in the second line there are L integers represent the sequence A, in the third line there are N integers represent
the sequences B, in the forth line there are M integers represent the sequence C. In the fifth line there is an integer S represents there are S integers X to be calculated. 1<=L, N, M<=500, 1<=S<=1000. all the integers are 32-integers.

Output

For each case, firstly you have to print the case number as the form "Case d:", then for the S queries, you calculate if the formula can be satisfied or not. If satisfied, you print "YES", otherwise print "NO".

Sample Input

3 3 3
1 2 3
1 2 3
1 2 3
3
1
4
10

Sample Output

Case 1:
NO
YES
NO

题目大意:

输入数据第一排是三个数,分别表示三个数组的大小. (三个数组的大小的最大值都是500)

接下来的三排是输入三个数组的数字.

然后第四排输入一个整数n表示接下来n排测试数据.

每个测试数据是一个整数m.

要求在上面的三个数组中每个数组找一个数(共三个数)相加之和等于该测试数据m.如果找到了就输出YES,如果不存在这样的三个数那么就输出NO.

大致思路:

因为题目给的数据每个数组最多有500个元素,那么如果三个for循环就是500*500*500肯定超时,(姑且我们这里把第一第二第三数组叫为a,b,c数组)

这个时候我们可以把c数组排序,然后用两个for循环枚举a,b两个数组中所有组合的和k,然后再用二分查找在c数组中查找m-k这个数.这样时间最多为500*500*log500≈2250000

或者是在a,b两个数组中所有组合的和k组成的数组中去二分查找m-c[i]这个数(以下代码便是).

代码如下:

#include <stdio.h>
#include <algorithm>
using namespace std;
int a[501],b[501],m[250001],c[501],flag;
void find(int a[],int b,int n)
{
    int left,right,mid;
    left=0,right=n-1;
    while(left<=right)
    {
        mid=(left+right)/2;
        if(a[mid]==b)
        {
            flag=1;
            break;
        }
        else if(a[mid]>b)
            right=mid-1;
        else
            left=mid+1;
    }
}
int main()
{
    int i,j,k,n1,n2,n3,n4,ci=0;
    while(scanf("%d%d%d",&n1,&n2,&n3)!=EOF)
    {
        ci++;
        for(i=0;i<n1;i++)
            scanf("%d",&a[i]);
        for(i=0;i<n2;i++)
            scanf("%d",&b[i]);
        for(i=0;i<n3;i++)
            scanf("%d",&c[i]);
        n4=0;
        for(i=0;i<n1;i++)
            for(j=0;j<n2;j++)
                m[n4++]=a[i]+b[j];
        sort(m,m+n4);
        int N;
        scanf("%d",&N);
        printf("Case %d:\n",ci);
        while(N--)
        {
            flag=0;
            scanf("%d",&k);
            for(i=0;i<n3;i++)
            {
                find(m,k-c[i],n4);
                if(flag==1)
                    break;
            }
            if(flag==1)
                printf("YES\n");
            else
                printf("NO\n");
        }
    }
    return 0;
}
时间: 2024-10-11 18:35:03

C语言排序(12)___Can you find it?(Hdu 2141)的相关文章

杂文 - [1.1]使用库语言排序算法

[1.1]使用库语言排序算法 本文地址: http://blog.csdn.net/caroline_wendy 如果不缺少内存, 可以直接使用库的排序算法. 使用库语言的排序程序: C语言性能最好的算法是快速排序(quick sort). C++性能最好的是集合(set)的排序算法. C语言代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <std

C语言排序算法总结

学计算机程序设计的应该都知道,算法是程序之魂.所谓算法,就是解决问题的方法加上有限的实现步骤.算法的特点有有穷性,确定性,有效性,有零个或多个输入,有一个或多个输出.下面我们就来简单总结一下C语言中的三种经典排序算法. 一.冒泡算法. 所谓冒泡排序法,就是对一组数字进行从大到小或从小到大排序的一种算法.具体方法是,相邻的数字两两交换.从第一个数值开始,如果相邻两个数的排列顺序与我们的期望不相同,则将两个数的位置进行交换(对调):如果其余我们期望的相同,则不交换位置.重复这样的过程,一直到最后没有

C语言排序算法复习

排序算法有很多种,这里在复习和分析的基础上,做一个自己的总结: 首先要知道有哪些排序算法,google一下,有云C语言7大经典排序算法(也有8大).主要包括冒泡排序,快速排序,选择排序,插入排序,希尔排序,归并排序,堆排序,8大的还有基数排序.各有各的版本,代码写法也各不相同.所以这里以整理思路为先,代码只是作为自己的一个备份. 搞清楚的概念:稳定排序和不稳定排序,就看序列中两个值相等的数,排完序之后的相对位置是否改变,如果改变了就不稳定. 内部排序和外部排序,只用到内存即可完成排序的就叫内部排

C语言第12轮:指针

C语言第12轮:指针 [学习目标] 1.        指针 2.        指针与数组 A: 指针的概念 内存存储单元按字节排序.每一个字节编有序号.我们称之为地址.因为能够通过地址就能够找到所要的内存单元,所以我们把地址成为指针.指针是个特殊的变量,它里面存储的数值被解释为内存里的一个地址 作用: (1)       指针能够有效地表示复杂数据结构,如队列.栈.链表等 (2)       指针能够像汇编一样处理内存地址,为动态内存分配提供支持 (3)       指针能够实现对数组和字符

C语言排序算法之简单交换法排序,直接选择排序,冒泡排序

C语言排序算法之简单交换法排序,直接选择排序,冒泡排序,最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 简单交换法排序 1 /*简单交换法排序 2 根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置 3 交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动 4 不稳定 5 */ 6 #include<windows.h> 7 #include<stdio.h> 8 void main(){ 9 int i,j,arr[10

C语言-排序和查找

一 冒泡排序:算法特点:两层循环外层控制排序的趟数,内存控制相邻元素两两比较的次数.n个数共需n-1趟,(i=1;i<n;i++)趟数=n-1-1+1,其中第j趟需要相邻元素两两比较的次数为n-j.可以按照升序也可以安排降序排序.其实还可以优化. oid Bubblesort(int *p,int n){    int i,j,temp;    for(i = 1;i < n;i++)    {        for(j = 0;i < (n - j);j++)        {    

C语言排序和查找

1.C语言选择排序算法及代码 选择排序是排序算法的一种,这里以从小到大排序为例进行讲解. 基本思想及举例说明 选择排序(从小到大)的基本思想是,首先,选出最小的数,放在第一个位置:然后,选出第二小的数,放在第二个位置:以此类推,直到所有的数从小到大排序. 在实现上,我们通常是先确定第i小的数所在的位置,然后,将其与第i个数进行交换. 下面,以对 3  2  4  1 进行选择排序说明排序过程,使用min_index 记录当前最小的数所在的位置. 第1轮 排序过程 (寻找第1小的数所在的位置) 3

c语言排序算法

用C语言总结一下常用排序算法,虽然大多数语言里已经提供了排序算法,比如C函数库中提供了qsort排序函数(内部为快速排序实现),但理解排序算法的思想的意义远远超过了实用的价值.这里我总结了常用的排序算法,并用C语言实现.这些算法的书写顺序也有一定的关联,比如希尔排序是对插入算法的改进,快速排序是对冒泡排序的改进,快速排序和归并排序都用递归实现.注:每种方法的实现尽量提供了相同的形参列表.这里并没用涉及堆排序,箱排序等算法的实现. 插入排序算法概要:插入排序依据遍历到第N个元素的时候前面的N-1个

C语言排序算法——简单选择排序算法

冒泡排序算法的思想是不断的交换,通过交换完成最终的排序. 选择排序的基本思想是每一趟在n-i+1个记录中选取最小的记录,作为第i个的记录. 1 void SimpleSelectSort(int *p) 2 { 3 int i,j,min; 4 for(i=0;i<10;i++) 5 { 6 min=i;    //将当前下标定义为最小下标 7 for(j=i+1;j<10;j++) 8 { 9 if(p[min>p[j]])    //如果有小于当前最小值的 10 { 11 min=j