Pagini recente » Cod sursa (job #370101) | Cod sursa (job #2041117) | Cod sursa (job #1413395) | Cod sursa (job #1199917) | Cod sursa (job #2650794)
#include <iostream>
#include <vector>
#include <deque>
#include <algorithm>
#include <math.h>
#include <fstream>
#include <unordered_map>
using namespace std;
ifstream fin("oite.in");
ofstream fout("oite.out");
int n, S, min1, min2, start, nr;
int maxAns(int s, unordered_map<int, int> individual)
{
int cur = 0, ans = 0;
for (int i = min1; i < (s + 1) / 2; ++i)
{
//if (s - i > S)
//continue;
int m = min(individual[i], individual[s - i]);
if (m == 0)
continue;
cur += m;
individual[i] -= m;
individual[s - i] -= m;
}
if (s % 2 == 0)
cur += individual[s / 2] / 2;
s = S - s;
int cur2 = 0;
for (int i = min1; i < (s + 1) / 2; ++i)
{
//if (s - i > S)
//continue;
int m = min(individual[i], individual[s - i]);
if (m == 0)
continue;
cur2 += m;
individual[i] -= m;
individual[s - i] -= m;
}
if (s % 2 == 0)
cur2 += individual[s / 2] / 2;
return min(cur, cur2);
}
int main()
{
fin >> n >> S;
unordered_map<int, int> individual;
fin >> min1 >> min2;
individual[min1]++;
individual[min2]++;
if (min1 > min2)
swap(min1, min2);
for (int i = 2; i < n; ++i)
{
int el;
fin >> el;
if (el > S)
continue;
if (el <= min1)
{
min2 = min1;
min1 = el;
}
individual[el]++;
}
int ans = 0;
start = min1 + min2;
for (int s = start; s <= S - start; ++s)
nr += maxAns(s, individual);
fout << nr;
}