Solution of 11057 - Exact Sum

Problem Description
source:https://uva.onlinejudge.org/external/110/11057.html

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. 

Sample Input 


40 40 
80 


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


Solution:
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <deque>
#include <fstream>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
#include<stdio.h>
#include<stdlib.h>

using namespace std;

int main()
{
    long int book, price[100000],balance,min, max,temp,diff,i,j,k=0;
    while(scanf("%ld",&book)==1)
    {
        k+=1;
        for(i=1;i<=book;i++)
            scanf("%ld",&price[i]);
        scanf("%ld",&balance);
        diff=99999999;
        for(i=1;i<book;i++)
        {
            if(price[i]>=balance)
                continue;
            for(j=i+1;j<=book;j++)
            {
                if(price[i]+price[j]==balance && diff>abs(price[i]-price[j]))
                {
                    diff=abs(price[i]-price[j]);
                    if(price[i]<price[j])
                    {
                        min=price[i];
                        max=price[j];
                    }
                    else
                    {
                        max=price[i];
                        min=price[j];
                    }

                }

            }
        }

        printf("Peter should buy books whose prices are %ld and %ld.\n\n",min,max);
    }
    return 0;
}
image

No comments:

Post a Comment

Write your comment - Share Knowledge and Experience