Usted dice en el comentario que no puede hacer que funcione, ya que no es lo suficientemente cuadrático. No veo ninguna razón para eso. El problema se codifica fácilmente como un programa cuadrático de enteros mixtos.
Si entiendo la definición de su problema, desea restringir la suma de los valores más grandes que un umbral. Introduzca una variable binaria que indique si x es mayor que a, e introduzca otra variable z que debería ser igual a x cuando esto se mantenga, y cero en caso contrario, y use la suma de las nuevas variables.
Usando la caja de herramientas MATLAB YALMIP para interactuar con CPLEX (o Gurobi o cualquier otro solucionador MIQP), el problema se resuelve trivialmente en fracciones de segundo. Aquí, un ejemplo aleatorio, implementado utilizando un modelo derivado manualmente y un modelo que explota las capacidades de modelado de alto nivel en YALMIP
% Create random data
N = 100;
y = rand(N,1);
a = rand(N,1);
b = rand(1);
% Decision variables
x = sdpvar(N,1);
z = sdpvar(N,1);
d = binvar(N,1);
% Define objective
Objective = (x-y)'*(x-y)
% High-level model
Con1 = [0 <= x <= 1,0 <= z <=1];
Con2 = [implies(x-a>=0,d), implies(d,z==x), implies(1-d,z==0)]
Con3 = [sum(z) <= b];
% Solve problem
solvesdp([Con1,Con2,Con3],Objective)
% display solution
[double(x) a double(z)]
% Manually derived model
Con1 = [0 <= x <= 1,0 <= z <=1];
Con2 = [x-a <= d, -(1-d) <= x-z <= 1-d, z <= d];
Con3 = [sum(z) <= b];
Objective = (x-y)'*(x-y)
solvesdp([Con1,Con2,Con3],Objective)
[double(x) a double(z)]