#include <bits/stdc++.h> using namespace std; struct cukierek{ long long kolor, masa, cena; }; constexpr long long inf = 2137696969696969669; constexpr int M = 7005; long long dp[M]; long long dp2[M]; long long wyniki[M]; cukierek tab[M]; bool czy(cukierek a, cukierek b){return a.kolor < b.kolor;} int main() { int n, m, k; cin>>n>>k>>m; for(int i=1; i<=n; i++) cin>>tab[i].kolor>>tab[i].masa>>tab[i].cena; sort(tab+1, tab+n+1, czy); tab[0].kolor = tab[1].kolor; for(int i=0; i<=m; i++) dp[i] = inf, dp2[i] = inf; dp[0] = 0; int ileK = 1; for(int i=1; i<=n; i++){ if(tab[i].kolor != tab[i-1].kolor){ ileK++; for(int j=0; j<m; j++) dp[j] = dp2[j], dp2[j] = inf; } for(int j=0; j<m; j++){ dp2[(j+tab[i].masa)%m] = min(dp[j] + tab[i].cena, dp2[(j+tab[i].masa)%m]); } } dp2[0] = 0; priority_queue<pair<long long, long long>> q; for(int i=0; i<m; i++) if(dp2[i]!=inf){ q.push({-1*dp2[i], i}); } while(!q.empty()){ pair<long long, long long> p = q.top(); q.pop(); p.first *= -1; for(int i=0; i<m; i++) if(dp2[i]!=inf){ if(dp2[i] + p.first < dp2[(i+p.second)%m]){ q.push({-1 * (dp2[i] + p.first), (i+p.second)%m}); dp2[(i+p.second)%m] = dp2[i] + p.first; } } } if(k > ileK){ cout<<"0"<<endl; for(int i=1; i<m; i++) cout<<"-1"<<endl; } else{ for(int i=0; i<m; i++){ if(dp2[i]==inf) cout<<"-1"<<endl; else cout<<dp2[i]<<endl; } } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | #include <bits/stdc++.h> using namespace std; struct cukierek{ long long kolor, masa, cena; }; constexpr long long inf = 2137696969696969669; constexpr int M = 7005; long long dp[M]; long long dp2[M]; long long wyniki[M]; cukierek tab[M]; bool czy(cukierek a, cukierek b){return a.kolor < b.kolor;} int main() { int n, m, k; cin>>n>>k>>m; for(int i=1; i<=n; i++) cin>>tab[i].kolor>>tab[i].masa>>tab[i].cena; sort(tab+1, tab+n+1, czy); tab[0].kolor = tab[1].kolor; for(int i=0; i<=m; i++) dp[i] = inf, dp2[i] = inf; dp[0] = 0; int ileK = 1; for(int i=1; i<=n; i++){ if(tab[i].kolor != tab[i-1].kolor){ ileK++; for(int j=0; j<m; j++) dp[j] = dp2[j], dp2[j] = inf; } for(int j=0; j<m; j++){ dp2[(j+tab[i].masa)%m] = min(dp[j] + tab[i].cena, dp2[(j+tab[i].masa)%m]); } } dp2[0] = 0; priority_queue<pair<long long, long long>> q; for(int i=0; i<m; i++) if(dp2[i]!=inf){ q.push({-1*dp2[i], i}); } while(!q.empty()){ pair<long long, long long> p = q.top(); q.pop(); p.first *= -1; for(int i=0; i<m; i++) if(dp2[i]!=inf){ if(dp2[i] + p.first < dp2[(i+p.second)%m]){ q.push({-1 * (dp2[i] + p.first), (i+p.second)%m}); dp2[(i+p.second)%m] = dp2[i] + p.first; } } } if(k > ileK){ cout<<"0"<<endl; for(int i=1; i<m; i++) cout<<"-1"<<endl; } else{ for(int i=0; i<m; i++){ if(dp2[i]==inf) cout<<"-1"<<endl; else cout<<dp2[i]<<endl; } } return 0; } |