AUCTION spoj – Going Once, Going Twice, Gone

Nguồn đề bài: AUCTION

1. Đề bài AUCTION spoj

Chế độ ăn kiêng của đàn bò khiến cho nông trang của nông dân John dôi ra 1 số lượng cỏ khô, vì vậy anh ta muốn bán đấu giá số cỏ khô này để trang trải phần nào chi phí chăn nuôi. Anh ta có N (1 <= N <= 1,000) bó cỏ khô giống nhau; khách hàng sẽ đấu giá để mua đống cỏ này là M (1 <= M <= 1,000) nông dân khác sống gần đó.
Mỗi một nông dân i sẽ cho nông dân John biết anh ta sẵn sàng trả P_i (1 <= P_i <= 1,000,000) đồng cho 1 bó cỏ khô. Mỗi một nông dân chỉ muốn mua 1 bó cỏ khô mà thôi. Để đảm bảo các nông dân không ghen tị với nhau, nông dân John sẽ đưa ra 1 mức giá cố định cho tất cả người đến mua và bán các bó cỏ khô cho những ai trả giá >= mức giá đó, những người còn lại sẽ bị từ chối giao dịch.
Hãy giúp nông dân John tính xem đặt mức giá nhỏ nhất là bao nhiêu để thu được nhiều tiền nhất có thể.

Dữ liệu
* Dòng 1: Hai số nguyên cách nhau bởi dấu cách: N và M
* Dòng 2..M+1: Dòng i+1 chứa 1 số nguyên duy nhất: P_i
Kết quả
* Dòng 1: 2 số nguyên cách nhau bởi dấu cách: giá bán của John và số tiền mà John thu được

Ví dụ
Dữ liệu:
5 4
2
8
10
7
Kết quả:
7 21

2. Code tham khảo AUCTION spoj

lưu ý 2 code mẫu dưới đây cách làm là khác nhau

a. Code pascal

program sdsdsd;
const   fi='';
type dayso = array[1..1000] of longint;
var n,m,vtmax:longint;
        i,max:longint;
        a:dayso;
        f:text;

function tinh(vt:longint):longint;
var     i:longint;
        s:longint;
begin
        if m-vt+1>n then
                exit(a[vt]*n);
        exit(a[vt]*(m-vt+1));
end;

procedure sort(l,r: longint);
      var
         i,j,x,y: longint;
      begin
         i:=l;
         j:=r;
         x:=a[(l+r) div 2];
         repeat
           while a[i]<x do
            inc(i);
           while x<a[j] do
            dec(j);
           if not(i>j) then
             begin
                y:=a[i];
                a[i]:=a[j];
                a[j]:=y;
                inc(i);
                j:=j-1;
             end;
         until i>j;
         if l<j then
           sort(l,j);
         if i<r then
           sort(i,r);
      end;


begin
        assign(f,fi); reset(f); readln(f,n,m);
        for i:= 1 to m do
                read(f,a[i]);
        close(f);
        sort(1,m);

        max:=tinh(1);    vtmax:=a[1];
        for i:= 2 to m do
            if max<tinh(i) then
                        begin
                                max:=tinh(i);
                                vtmax:=a[i];
                        end;

        writeln(vtmax, ' ',max);
end.

b. Code C++

#include <bits/stdc++.h>
using namespace std;

int n,m;
vector<int> a;

void Init()
{
    cin>>n>>m;
    a.resize(m);
    for (int i=0;i<m;i++)
    {
        cin>>a[i];
    }
}

void Solve()
{
    int res=0;
    int gia=0;
    for (int i=0;i<m;i++)
    {
        int sum=0;
        for (int j=0;j<m;j++)
        {
            if(a[j]>=a[i]) sum+=a[i];
        }
        sum=min(sum,n*a[i]);
        if(sum==res)
            gia=min(gia,a[i]);
        if(sum>res)
        {
            res=sum;
            gia=a[i];
        }
    }
    cout<<gia<<" "<<res;
}

int main()
{
    Init();
    Solve();
}

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *