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;
}