【UVa】11057 – Exact Sum

23 篇文章 0 订阅
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;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值