远古数据AC代码

#include<cstdio> #include<cstring> #include<cmath> using namespace std; int k,m; int a[501],f[501][501],d[501],L[501],R[501],v[501][501]; /*int print(int i,int j) { int x,t; if(j==0)return 0; if(j==1) { printf("1 %d\n",i); return 0; } t=i; x=a[i]; while(x+a[t-1]<=f[k][m]) { x+=a[t-1]; t--; } print(t-1,j-1); printf("%d %d\n",t,i); }*/ int main() { scanf("%d%d",&m,&k); //if(m==0&&k==0)return 0; for(int i=0;i<=500;i++) { for(int j=0;j<=500;j++) { f[i][j]=0x7fffffff; } } for(int i=1;i<=m;i++) { scanf("%d",&a[i]); d[i]=d[i-1]+a[i]; f[1][i]=d[i]; } for(int i=2;i<=k;i++) { for(int j=1;j<=m;j++) { for(int h=0;h<=j;h++) { if(fmax(f[i-1][h],d[j]-d[h])<f[i][j]) { f[i][j]=fmax(f[i-1][h],d[j]-d[h]); v[i][j]=h; } } } } int tmp=m; for(int i=k;i>=1;i--) { R[i]=tmp; L[i]=v[i][tmp]+1; tmp=v[i][tmp]; } for(int i=1;i<=k;i++) { printf("%d %d\n",L[i],R[i]); } return 0; }

正常数据AC代码

#include<cstdio> #include<cstring> #include<iostream> using namespace std; int s[505],f[505][505],a[505]; int k,m; void print(int i,int j) { if(j==0)return ; if(j==1) { printf("1 %d\n",i); return ; } int t=i; int x=a[i]; while((x+a[t-1]<=f[k][m])&&(t)) { x+=a[t-1]; t--; } print(t-1,j-1); printf("%d %d\n",t,i); } int main() { scanf("%d%d",&m,&k); for(int i=0;i<=501;i++) { for(int j=0;j<=501;j++) { f[i][j]=2147483640; } } for(int i=1;i<=m;i++) { scanf("%d",&a[i]); s[i]=s[i-1]+a[i]; f[1][i]=s[i]; } for(int i=2;i<=k;i++) { for(int j=1;j<=m;j++) { for(int k=0;k<=j;k++) { f[i][j]=min(f[i][j],max(f[i-1][k],s[j]-s[k])); } } } print(m,k); return 0; }

差异:

远古数据要让前面的人少抄写,并且可以不吵,正常数据每人都抄。