Pagini recente » Cod sursa (job #2595314) | Cod sursa (job #593354) | Cod sursa (job #826488) | Cod sursa (job #3273456) | Cod sursa (job #43704)
Cod sursa(job #43704)
#include <fstream>
using namespace std;
#define MAX 35
#define INF 1000000
struct ban {
int a;
int c;
} b[MAX], aux;
long long int n, l, C;
long long int nr[MAX];
int s2[MAX];
int s[MAX];
long long int rez[MAX];
int poz[MAX];
long long int sum = 0;
long long int nrmin = INF;
int nrm = 0;
int pre = 0;
ifstream fin ("shop.in");
ofstream fout ("shop.out");
void QuickS(int st, int dr);
void Rec();
int main()
{
fin >> n >> C >> l;
long long int ama = 0;
for ( int i = 1; i <= n; i++ )
{
fin >> b[i].a >> b[i].c;
s2[b[i].a] = 1;
poz[b[i].a] = i;
if ( b[i].a > ama ) ama = b[i].a;
}
QuickS(1,n);
fin.close();
pre = n;
Rec();
fout << nrmin << "\n";
for ( int i = 1; i <= n; i++ )
{
fout << rez[i] << " ";
}
fout.close();
return 0;
}
void Rec()
{
for ( int i = pre; i >= 1; i-- )
{
if ( s[i] + 1 <= b[i].c )
{
long long int po = 1;
for ( int j = 1; j <= b[i].a; j++ )
{
po*=C;
}
sum+=po;
nrm++;
nr[poz[b[i].a]]++;
s[i]++;
if ( sum == l )
{
if ( nrm <= nrmin )
{
nrmin = nrm;
for ( int j = 1; j <= n; j++ )
{
rez[j] = nr[j];
}
}
}
else
{
pre = i;
Rec();
}
nrm--;
sum-=po;
nr[poz[b[i].a]]--;
s[i]--;
}
}
}
void QuickS(int st, int dr)
{
int pivot = (st+dr)>>1;
int i = st-1;
int j = dr+1;
do
{
do { i++; } while ( b[i].a < b[pivot].a );
do { j--; } while ( b[j].a > b[pivot].a );
if ( i <= j )
{
aux = b[i];
b[i] = b[j];
b[j] = aux;
int au = nr[b[i].a];
nr[b[i].a] = nr[b[j].a];
nr[b[j].a] = au;
}
} while ( i <= j );
if ( j >= st ) QuickS(st,j);
if ( i <= dr ) QuickS(i,dr);
}