Friday, February 26, 2016

【UVa】11057 – Exact Sum

Problem here

Problem

Peter received money from his parents this week and wants to spend it all buying books. But he does not read a book so fast, because he likes to enjoy every single word while he is reading. In this way, it takes 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 until receive more money. As he wishes to spend all the money, he should choose two books whose prices summed up are equal to the money that he has. It is a little bit difficult to find these books, so Peter asks your help to find them.

Input

Each test case starts with 2 ≤ N ≤ 10000, the number of available books. Next line will have N integers, representing the price of each book, a book costs less than 1000001. Then there is another line with an integer M, representing how much money Peter has. There is a blank line after each test case. 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 and j.』, where i and j are the prices of the books whose sum is equal do M and i ≤ j. You can consider that is always possible to find a solution, if there are multiple solutions print the solution that minimizes the difference between the prices i and j. After each test case you must print a blank line.

Input Sample

2
40 40
80
5
10 2 6 8 4
10

Output Sample

Peter should buy books whose prices are 40 and 40.
Peter should buy books whose prices are 4 and 6.

Solution

取得兩數的和是本錢的差值
然後在差值中找最小
注意輸出後要再空一行
#include <iostream>
#include <vector>
#include <algorithm>
#include <stdio.h>
using namespace std;
vector<int>books;
int book;
int money;
int ansI, ansJ;
void slove(int l, int r){
    int dis = 9999999;
    for(int i = 0; i < books.size(); i++){
        for(int j = 0; j < books.size(); j++){
            if(books[i] + books[j] == money && books[i] != money && books[j] != money){
                int tmp = (books[i] < books[j]) ? (books[j] - books[i]) : (books[i] - books[j]);
                if(tmp < dis){
                    dis = tmp;
                    ansI = i;
                    ansJ = j;
                }
            }
        }
    }
}
 
int main(){
     
    int n;
    while(cin >> n){
        for(int i = 0; i < n; i++){
            cin >> book;
            books.push_back(book);
        }
        cin >> money;
        sort(books.begin(), books.end());
        slove(0, books.size()-1);
        cout << "Peter should buy books whose prices are " << books[ansI] << " and "<< books[ansJ] << "." << endl;
        cout << endl;
        char c = getchar();
        books.clear();
        ansI = 0;
        ansJ = 0;
    }
     
    return 0;
}

No comments:

Post a Comment