严重超时。只过了第1,4个点,得12分,以后再说。
后来换了思路,还是只得了16分,只有第2点错误,第4点超时,想不出不过的case。
//23:46 16分 #include<stdio.h> const int NUM=100005; int a[NUM]; int main() { int n,i,val; int index=-1; freopen("C:\\Documents and Settings\\Administrator\\桌面\\input.txt","r",stdin); scanf("%d%d",&n,&val); a[0]=0; for(i=1;i<=n;i++){ scanf("%d",&a[i]); a[i]+=a[i-1]; if(index==-1&&a[i]>=val){ index=i; } } int j,fg=0; for(i=index;i<=n;i++){ for(j=0;j<i;j++){ if(a[i]-a[j]==val){ fg=1; printf("%d-%d\n",j+1,i); } } } if(fg==0){ for(i=index;i<=n;i++){ for(j=i-1;j>=0;j--){ if(a[i]-a[j]>val){ printf("%d-%d\n",j+1,i); break; } } } } return 0; }
//1044 0:40 #include<stdio.h> const int MAXN=100005; int dp[MAXN]; int a[MAXN]; int main() { int n,i,j,val; //freopen("C:\\Documents and Settings\\Administrator\\桌面\\input.txt","r",stdin); scanf("%d%d",&n,&val); for(i=0;i<n;i++){ scanf("%d",&a[i]); dp[i]=a[i]; } int fg=0; int index; for(i=0;i<n;i++){ if(dp[i]==val){ fg=1; printf("%d-%d\n",i+1,i+1); continue; } for(j=i+1;j<n;j++){ if(dp[i]+a[j]==val){ fg=1; printf("%d-%d\n",i+1,j+1); break; } else if(dp[i]+a[j]<val) dp[i]+=a[j]; } } if(fg!=1){ for(i=0;i<n;){ dp[i]=a[i]; if(dp[i]>val){ printf("%d-%d\n",i+1,i+1); i++; continue; } for(j=i+1;j<n;j++){ if(dp[i]+a[j]>val){ index=i; while(dp[i]+a[j]-a[index]>val){ dp[i]-=a[index]; index++; } printf("%d-%d\n",index+1,j+1); i=index; break; } else dp[i]+=a[j]; } i++; } } return 0; }