sharpcoder's blog

By sharpcoder, history, 9 years ago, In English

Following are two codes of same problem SPOJ MIXTURES. The first is getting accepted but the second one is showing time limit exceeded. Although, Both codes are completely same. but the only difference between following codes is in line no. 12 (numbered) i.e int &r in first code and only int r in second. Please tell why the second code getting time limit exceeded and first one is getting accepted.

FIRST CODE

 #include <bits/stdc++.h>

using namespace std;

int a[100],sum[100][100],dp[100][100];
int solve(int ai,int bi){
    if(ai==bi){
       return 0;
    }
    if((ai+1)==bi)
        return a[ai] * a[bi];
12.         **int &r= dp[ai][bi],c;**
        if(r==-1){
            for(int i=ai;i+1<=bi;i++){
                c= sum[ai][i] * sum[i+1][bi] + solve(ai,i) + solve(i+1,bi);
            if(r==-1 || c<r)r=c;
            }
        }
        return r;
}
int main()
{
    int n;
    while(scanf("%d", &n)==1){
        for(int i=0;i<n;i++)
             scanf("%d",&a[i]);
            for(int i = 0;i < n;++i) sum[i][i] = a[i];
            for(int i=0;i<n;i++){
                for(int j=i+1;j<n;j++){
                    sum[i][j]=sum[i][j-1] + a[j];
                    if(sum[i][j]>=100)
                        sum[i][j]-=100;
                }

            }
            memset(dp,-1,sizeof dp);
             printf("%d\n",solve(0,n-1));


    }

    return 0;
}

SECOND CODE

#include <bits/stdc++.h>

using namespace std;

int a[100],sum[100][100],dp[100][100];
int solve(int ai,int bi){
    if(ai==bi){
       return 0;
    }
    if((ai+1)==bi)
        return a[ai] * a[bi];
12.         **int r= dp[ai][bi],c;**
        if(r==-1){
            for(int i=ai;i+1<=bi;i++){
                c= sum[ai][i] * sum[i+1][bi] + solve(ai,i) + solve(i+1,bi);
            if(r==-1 || c<r)r=c;
            }
        }
        return r;
}
int main()
{
    int n;
    while(scanf("%d", &n)==1){
        for(int i=0;i<n;i++)
             scanf("%d",&a[i]);
            for(int i = 0;i < n;++i) sum[i][i] = a[i];
            for(int i=0;i<n;i++){
                for(int j=i+1;j<n;j++){
                    sum[i][j]=sum[i][j-1] + a[j];
                    if(sum[i][j]>=100)
                        sum[i][j]-=100;
                }

            }
            memset(dp,-1,sizeof dp);
             printf("%d\n",solve(0,n-1));


    }

    return 0;
}

Full text and comments »

Tags dp, c++, spoj
  • Vote: I like it
  • 0
  • Vote: I do not like it

By sharpcoder, history, 9 years ago, In English

Please tell what is wrong in following code for spoj's gss1 problem. I am getting wrong answer.

#include <bits/stdc++.h>

using namespace std;
int arr[50000 + 5];
int segment[131080];
int segmentC(int si,int as,int ae){
    if(as==ae){
            if(arr[as]<0){
                segment[si]=0;
                return 0;
            }
            else{
                    segment[si]=arr[as];
        return arr[as];}
            }
    int mid= as + (ae-as)/2;
    segment[si]= segmentC(2*si+1,as,mid) + segmentC(2*si+2,mid+1,ae);
    return segment[si];
}
int getsum(int s,int e,int qs,int qe,int ind){
    if(qs<=s && qe>=e)
        {
            return segment[ind];
        }
    if(qs>e || qe<s)
        return 0;
    int mid = s+ (e-s)/2;
    return getsum(s,mid,qs,qe,2 *ind+1) + getsum(mid+1,e,qs,qe,2 *ind+2);
}

int main()
{
    int m,n,qs,qe;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        cin >>arr[i];
   // int h= ceil(log2(n+1));
    //int s= 2*(int)pow(2,h) -1;
    //memset(segment,0,sizeof segment);
    segmentC(0,0,n-1);
    scanf("%d",&m);
    int r;

    for(int i=0;i<m;i++){
        scanf("%d%d",&qs,&qe);
        r=getsum(0,n-1,qs-1,qe-1,0);
        if(r>0)
            printf("%d\n",r);
        else if(r==0){
            int x= *max_element(arr+qs-1,arr+qe-1);
            if(x<0){
                printf("%d\n", x);
            }
            else
                printf("%d\n", r);
        }


    }

    return 0;
}
Your code here...

Full text and comments »

  • Vote: I like it
  • -2
  • Vote: I do not like it