#include <bits/stdc++.h> using namespace std; pair<int, pair< int, long long> > T[7100]; const int dl = 7100; long long dp[dl+10]; long long dpp[dl+10]; long long dp2[dl+10]; int nr[dl+10]; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, k, m; cin>>n>>k>>m; for(int i = 0;i < n ;i++){ cin>>T[i].first>>T[i].second.first>>T[i].second.second; } sort(T, T+n); int ost =0; int pop = T[0].first; for(int i=1;i<=dl;i++){ dpp[i]=LLONG_MAX; dp[i] = LLONG_MAX; dp2[i] = LLONG_MAX; nr[i] = -1; } nr[0] = -1; dp[0] = LLONG_MAX; for(int i=0; i<n;i++){ if(pop != T[i].first){ for(int j=0; j<m; j++){ dpp[j] = dp[j]; dp[j] = LLONG_MAX; } } if(pop + 1 < T[i].first){ break; } for(int j = m-1; j>=0; j--){ if(dpp[j] < LLONG_MAX){ dp[(j + T[i].second.first)%m]=min(dpp[j] + T[i].second.second, dp[(j + T[i].second.first)%m]); } } pop=T[i].first; } if(pop != k or T[0].first != 1){ for(int j=0;j<m;j++){ dp[j] = LLONG_MAX; } } for(int j=0; j <m; j++){ if(dp[j]==LLONG_MAX){ continue; } // cout<<"w"<<j<<"\n"; for(int jj = 0; jj<m; jj++){ int poz = jj; while(dp2[(poz+j)%m] > dp2[poz]+dp[j] && dp2[poz]!=LLONG_MAX){ dp2[(poz+j)%m] = min(dp2[(poz+j)%m], dp2[poz]+dp[j]); //cout<<"z"<<" "<<(poz+j)%m<<" "<<dp2[(poz+j)%m]<<"\n"; nr[(poz+j)%m] = j; poz = (poz+j)%m; } } } for(int jj=0; jj<m;jj++){ if(dp2[jj]==LLONG_MAX){ cout<<-1<<"\n"; } else{ cout<<dp2[jj]<<"\n"; } } }
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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | #include <bits/stdc++.h> using namespace std; pair<int, pair< int, long long> > T[7100]; const int dl = 7100; long long dp[dl+10]; long long dpp[dl+10]; long long dp2[dl+10]; int nr[dl+10]; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, k, m; cin>>n>>k>>m; for(int i = 0;i < n ;i++){ cin>>T[i].first>>T[i].second.first>>T[i].second.second; } sort(T, T+n); int ost =0; int pop = T[0].first; for(int i=1;i<=dl;i++){ dpp[i]=LLONG_MAX; dp[i] = LLONG_MAX; dp2[i] = LLONG_MAX; nr[i] = -1; } nr[0] = -1; dp[0] = LLONG_MAX; for(int i=0; i<n;i++){ if(pop != T[i].first){ for(int j=0; j<m; j++){ dpp[j] = dp[j]; dp[j] = LLONG_MAX; } } if(pop + 1 < T[i].first){ break; } for(int j = m-1; j>=0; j--){ if(dpp[j] < LLONG_MAX){ dp[(j + T[i].second.first)%m]=min(dpp[j] + T[i].second.second, dp[(j + T[i].second.first)%m]); } } pop=T[i].first; } if(pop != k or T[0].first != 1){ for(int j=0;j<m;j++){ dp[j] = LLONG_MAX; } } for(int j=0; j <m; j++){ if(dp[j]==LLONG_MAX){ continue; } // cout<<"w"<<j<<"\n"; for(int jj = 0; jj<m; jj++){ int poz = jj; while(dp2[(poz+j)%m] > dp2[poz]+dp[j] && dp2[poz]!=LLONG_MAX){ dp2[(poz+j)%m] = min(dp2[(poz+j)%m], dp2[poz]+dp[j]); //cout<<"z"<<" "<<(poz+j)%m<<" "<<dp2[(poz+j)%m]<<"\n"; nr[(poz+j)%m] = j; poz = (poz+j)%m; } } } for(int jj=0; jj<m;jj++){ if(dp2[jj]==LLONG_MAX){ cout<<-1<<"\n"; } else{ cout<<dp2[jj]<<"\n"; } } } |