UVA11057 Exact Sum【暴力+排序+搜索+最值】

Peter received money from his parents this week and wants to spend it all buying books. But he doesnot read a book so fast, because he likes to enjoy every single word while he is reading. In this way, ittakes him a week to finish a book.

  As Peter receives money every two weeks, he decided to buy two books, then he can read them untilreceive more money. As he wishes to spend all the money, he should choose two books whose pricessummed up are equal to the money that he has. It is a little bit difficult to find these books, so Peterasks your help to find them.

Input

Each test case starts with 2 ≤ N ≤ 10000, the number of available books. Next line will have Nintegers, representing the price of each book, a book costs less than 1000001. Then there is anotherline with an integer M, representing how much money Peter has. There is a blank line after each testcase. The input is terminated by end of file (EOF).

Output

For each test case you must print the message: ‘Peter should buy books whose prices are i andj.’, where i and j are the prices of the books whose sum is equal do M and i ≤ j. You can consider thatis always possible to find a solution, if there are multiple solutions print the solution that minimizesthe difference between the prices i and j. After each test case you must print a blank line.

Sample Input

2

40 40

80

5

10 2 6 8 4

10

Sample Output

Peter should buy books whose prices are 40 and 40.


Peter should buy books whose prices are 4 and 6.


问题链接UVA11057 Exact Sum

问题简述

  给出n个书的价格,给出零花钱的金额m,找出正好两本价格之和等于零花钱并且差价最小的两本书的价格。题目保证问题是有解的!

问题分析

  这个问题数据量不大,可以用暴力法来解。

  另外一种方法是,先对数据排序,然后从中进行搜索。需要注意的是,这个搜索过程是一种寻找最值的过程,那两个数必然在相距比较近的位置。

程序说明

  给出上述的两种算法程序。

  数据有序后,搜索过程是一种套路,需要理解其关键

题记:(略)

参考链接:(略)


AC的C++语言程序如下(排序):

/* UVA11057 Exact Sum */

#include <iostream>
#include <algorithm>
#include <stdio.h>

using namespace std;

const int N = 10000;
int a[N];

int main()
{
    int n, m;

    while(~scanf("%d", &n)) {
        for(int i=0; i<n; i++)
            scanf("%d", &a[i]);
        scanf("%d", &m);

        sort(a, a+n);

        int low=0, high=n-1, pi, pj;
        while(low < high) {
            if(a[low] + a[high] < m)
                low++;
            else if(a[low] + a[high] == m) {
                pi = low++;
                pj = high--;
            } else
                high--;
        }

        printf("Peter should buy books whose prices are %d and %d.\n\n", a[pi], a[pj]);

    }

    return 0;
}


AC的C语言程序如下(暴力):

/* UVA11057 Exact Sum */

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>

#define N 10000
int a[N];

int main(void)
{
    int n, m, i, j;

    while(~scanf("%d", &n)) {
        for(i=0; i<n; i++)
            scanf("%d", &a[i]);
        scanf("%d", &m);

        int mindelta = INT_MAX, mini, minj, delta;
        for(i=0; i<n; i++)
            for(j=i+1; j<n; j++) {
                if(a[i] + a[j] == m) {
                    delta = abs(a[i] - a[j]);
                    if(delta < mindelta) {
                        mindelta = delta;
                        mini = i;
                        minj = j;
                    }
                }
            }

        int minp = a[mini] < a[minj] ? a[mini] : a[minj];
        int maxp = a[mini] > a[minj] ? a[mini] : a[minj];
        printf("Peter should buy books whose prices are %d and %d.\n\n", minp, maxp);
    }

    return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值