Submission #73794

#TimeUsernameProblemLanguageResultExecution timeMemory
73794KLPPSemiexpress (JOI17_semiexpress)C++14
48 / 100
1076 ms33772 KiB
#include<iostream> #include<stdio.h> using namespace std; typedef long long int lld; lld DP[4000][4000]; lld cost[4000][4000]; lld calculatestations(lld N,lld T, lld A, lld B,int S){//N estacoes, tempo minimo T, A normal, B semiexpresso,S estacoes semiexpresso //cout<<N<<" "<<T<<" "<<A<<" "<<B<<" "<<S<<endl; if(T<0)return 0; //if(T==0)return 1; if(A*(N-1)<=T)return N; int pos=T/A; //cout<<pos<<endl; if(S==0)return pos+1; return 1+pos+calculatestations(N-pos-1,T-B*(pos+1),A,B,S-1); } void computeDP(int x, int y, int lo, int hi,int level){ if(x>y)return; int bestindex=lo; int mid=(x+y)/2; for(int i=lo;i<=hi && i<=mid;i++){ if(DP[level-1][mid-i]+cost[level-1][i]>DP[level][mid]){ DP[level][mid]=DP[level-1][mid-i]+cost[level-1][i]; bestindex=i; } } computeDP(x,mid-1,lo,bestindex,level); computeDP(mid+1,y,bestindex,hi,level); } int main(){ int n,m,k; cin>>n>>m>>k; k-=m; lld a,b,c; cin>>a>>b>>c; lld arr[m]; lld T; cin>>T; for(int i=0;i<m;i++)cin>>arr[i]; for(int i=0;i<m-1;i++){ for(int j=0;j<=k;j++){ cost[i][j]=calculatestations(arr[i+1]-arr[i],T-b*arr[i]+b,a,c,j); //cout<<i<<" "<<j<<" "<<cost[i][j]<<" "<<arr[i+1]-arr[i]<<endl; } } lld ans=0; if(b*(n-1)>T)ans--; for(int i=0;i<m;i++){ for(int j=0;j<=k;j++)DP[i][j]=-1000000; } for(int i=0;i<=k;i++)DP[0][i]=0; for(int i=1;i<m;i++){ computeDP(0,k,0,k,i); /*for(int j=0;j<=k;j++){ for(int l=0;j+l<=k;l++){ DP[i][j+l]=max(DP[i][j+l],cost[i-1][l]+DP[i-1][j]); } }*/ } /*for(int i=0;i<m;i++){ for(int j=0;j<=k;j++)cout<<DP[i][j]<<" "; cout<<endl; }*/ ans+=DP[m-1][k]; cout<<ans<<endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...