Nguồn đề bài: http://www.spoj.com/PTIT/problems/PTIT016D/
1. Đề bài PTIT016D spoj
Một dãy gồm n số nguyên không âm a1, a2,…, an được viết thành một hàng ngang, giữa hai số liên tiếp có một khoảng trắng, như vậy có tất cả (n-1) khoảng trắng. Người ta muốn đặt k dấu cộng và (n-1-k) dấu trừ vào (n-1) khoảng trắng đó để nhận được một biểu thức có giá trị lớn nhất.
Ví dụ, với dãy gồm 5 số nguyên 28, 9, 5, 1, 69 và k = 2 thì cách đặt 28+9-5-1+69 là biểu thức có giá trị lớn nhất.
Yêu cầu: Cho dãy gồm n số nguyên không âm a1, a2,…, an và số nguyên dương k, hãy tìm cách đặt k dấu cộng và (n-1-k) dấu trừ vào (n-1) khoảng trắng để nhận được một biểu thức có giá trị lớn nhất.
Input
– Dòng đầu chứa hai số nguyên dương n, k (k < n ≤ 105);
– Dòng thứ hai chứa n số nguyên không âm a1, a2,…, an (an ≤ 106)
Output
– Một số nguyên là giá trị của biểu thức đạt được.
Example
Input:
5 2
28 9 5 1 69
Output:
100
2. Code tham khảo PTIT016D spoj PTIT- ACM PTIT 2016
#include <iostream>
#include <algorithm>
#include<functional>
using namespace std;
#define nmax 100000
long long n, k, a[nmax];
void docfile()
{
cin >> n>> k;
long i;
for (i = 0; i < n; i++)
cin >> a[i];
}
void xuli()
{
sort(a + 1, a + n, greater<int>());
long i;
long long s = 0;
for (i = 0; i <= k; i++)
s = s + a[i];
for (i = k+1; i <n; i++)
s = s - a[i];
cout << s;
}
int main()
{
docfile();
xuli();
return 0;
}