Pagini recente » Cod sursa (job #2361171) | Cod sursa (job #2054095) | Cod sursa (job #3218881) | Cod sursa (job #2257) | Cod sursa (job #1856298)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#include <queue>
#define N 50100
#define INF -1
using namespace std;
struct plasa {
int p , t ;
};
plasa pls [ N ] ;
int fish [ N ] ;
int best [ N ] ;
long long sol [ N ];
bool cmp ( plasa a , plasa b ){
return a.t < b.t ;
}
priority_queue < int > que ;
int main(){
int n , k , tmax , i , j ,id ;
int sum = 0 ;
freopen("peste.in","r",stdin );
freopen("peste.out","w",stdout );
scanf("%d%d%d", &n , &k , &tmax );
for ( i = 0 ; i < n ; i ++ ){
scanf("%d%d",&pls[ i ].p , &pls [ i ].t );
}
sort ( pls , pls + n , cmp );
int nr = 0 ;
for ( i = 0 ; i < n ; i ++ ){
sum += pls [ i ] . p ;
que. push ( pls [ i ]. p );
nr ++ ;
if ( nr > k ){
sum -= que.top();
que.pop() ;
nr-- ;
}
best [ i ] = sum ;
}
for ( i = 0 ; i <= tmax ; i ++ ){
sol [ i ] = INF ;
}
sol [ 0 ] = 0 ;
for ( i = 0 ; i < n ; i ++ ){
for ( j = tmax - pls [ i ] .t ; j >=0 ; j -- ){
if ( sol [ j ] == INF ){
continue ;
}
if ( sol[ j + pls [ i ].t ] < sol [ j ] + best [ i ] ){
sol[ j + pls [ i ].t ] = sol [ j ] + best [ i ] ;
}
for ( id = j + 2 * pls [ i ].t ; id <= tmax ; id += pls [ i ].t ){
if ( sol [ id ] < sol [ id - pls[ i ].t ] + best [ i ] ){
sol [ id ] = sol [ id - pls[ i ].t ] + best [ i ] ;
}else {
break ;
}
}
}
}
for ( i = 0 ; i <= tmax ; i ++ ){
sol[ tmax ] = max ( sol [ i ] , sol [ tmax ] ) ;
}
if ( sol [ tmax ] == -1 ){
printf("0");
return 0 ;
}
printf("%lld",sol[ tmax ] );
return 0;
}