Cod sursa(job #2650794)

Utilizator IRadu1529Radu Ionescu IRadu1529 Data 20 septembrie 2020 11:27:47
Problema Oite Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#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;
}