Submission #955337

#TimeUsernameProblemLanguageResultExecution timeMemory
955337sleepntsheepKnapsack (NOI18_knapsack)C11
100 / 100
61 ms2416 KiB
unsigned rng=12345; int rand_(){return (rng*=3)>>1;} int(*compar)(int,int); void sort_(int*a,int l,int r) { while(l<r) { int i=l,j=l,k=r,t,p=a[l+rand_()%(r-l)]; while(j<k) switch(compar(a[j],p)) { case 0:++j;break; case -1:t=a[i],a[i]=a[j],a[j]=t,++i,++j;break; case 1:t=a[--k],a[k]=a[j],a[j]=t;break; } sort_(a,l,i); l=k; } } int min_(int a,int b){return a<b?a:b;} long long max_(long long a,long long b){return a>b?a:b;} #include<stdio.h> #include<stdlib.h> #define S 2005 #define N 100005 int s,n,v[N],w[N],k[N]; int *eh[N],eo[N]; void append(int i,int j) { int o=eo[i]++; if(o>=2&&(o&o-1)==0)eh[i]=(int*)realloc(eh[i],2*o*sizeof**eh); eh[i][o]=j; } int c0(int i,int j){return v[i]<v[j]?1:v[i]>v[j]?-1:0;} #define SlgS (S*13) int vv[SlgS],ww[SlgS],oo; long long dp[S]; int main() { scanf("%d%d",&s,&n); for(int i=1;i<=s;++i)eh[i]=(int*)realloc(0,sizeof**eh*2); for(int i=1;i<=n;++i) scanf("%d%d%d",v+i,w+i,k+i), append(w[i],i); compar=c0; for(int i=1;i<=s;++i) sort_(eh[i],0,eo[i]); for(int i=1;i<=s;++i) { int left=(s+i-1)/i; for(int j=0;left&&j<eo[i];++j) { int take=min_(left,k[eh[i][j]]); for(int k=0;k<take;++k) { vv[oo]=v[eh[i][j]]; ww[oo]=w[eh[i][j]]; ++oo; } left-=take; } dp[i]=-1e18; } for(int i=0;i<oo;++i) { for(int j=s;j>=ww[i];--j) { dp[j]=max_(dp[j],dp[j-ww[i]]+vv[i]); dp[s+1]=max_(dp[s+1],dp[j]); } } printf("%lld",dp[s+1]); }

Compilation message (stderr)

knapsack.c: In function 'append':
knapsack.c:37:18: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
   37 |     if(o>=2&&(o&o-1)==0)eh[i]=(int*)realloc(eh[i],2*o*sizeof**eh);
      |                 ~^~
knapsack.c: In function 'main':
knapsack.c:51:5: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   51 |     scanf("%d%d",&s,&n);
      |     ^~~~~~~~~~~~~~~~~~~
knapsack.c:55:9: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   55 |         scanf("%d%d%d",v+i,w+i,k+i),
      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...