Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Profil aternativ | Diferente pentru utilizator/mihaelacismaru intre reviziile 66 si 65 | Cod sursa (job #944069)
Cod sursa(job #944069)
#include<cstring>
#include<fstream>
#include<algorithm>
#include<bitset>
using namespace std;
const int knmax = 110;
int len, n, spa[105], spb[105], ansa[105], ansb[105], dad[105][115][2];
int dp[105][115];
void read(){
ifstream in("lapte.in");
in >> n >> len;
for(int i = 1; i <= n; ++i)
in >> spa[i] >> spb[i];
}
int u, gx, gy;
int rowrowrow(int x, int lv){
register int q, r;
++u;
if(lv)
memset(dad, 0, sizeof(dad));
dp[0][0] = u;
for(int i = 1; i <= n; ++i)
for(int j = len; j >= 0; --j)
for(int k = knmax; k >= 0; --k)if(dp[j][k]!=u){
q = x / spa[i];
for(int l = 0; l <= q; ++l){
r = (x - (l * spa[i])) / spb[i];
if(r > k || l > j)
continue;
if(dp[j - l][k - r] == u){
dp[j][k] = u;
if(lv){
dad[j][k][0] = i;
dad[j][k][1] = l;
}
}
if(j >= len && k >= len && dp[j][k] == u){
gx = j;
gy = k;
return 1;
}
}
}
return 0;
}
int ans;
void solve(){
int left = len / 2, right = 100, mid, last = -1;
while(left <= right){
mid = (left + right) >> 1;
if(rowrowrow(mid, 0)){
last = mid;
right = mid - 1;
}
else
left = mid + 1;
}
ans = last;
rowrowrow(ans, 1);
while(gx || gy){
int p = dad[gx][gy][0], l1 = dad[gx][gy][1];
int l2 = (ans - l1 * spa[p]) / spb[p];
ansa[p] = l1;
ansb[p] = l2;
gx -= l1;
gy -= l2;
}
}
void write(){
ofstream out("lapte.out");
out << ans << "\n";
for(int i = 1; i <= n; ++i)
out << ansa[i] << " " << ansb[i] << "\n";
}
int main(){
read();
solve();
write();
return 0;
}