Search This Blog

Showing posts with label SPOJ. Show all posts
Showing posts with label SPOJ. Show all posts

Tuesday, 23 August 2016

SPOJ - Philosophers Stone solution using DP

SPOJ - Philosophers Stone solution using DP

Solution:-

#include<bits/stdc++.h>
using namespace std;
#define MAX 200

int arr[MAX][MAX];

int max_val(int a,int b,int c)
{
    int p=INT_MIN;
    p=p>a?p:a;
    p=p>b?p:b;
    p=p>c?p:c;

    return p;
}

int main()
{
    int tc;
    int a,b;
    cin>>tc;
    while(tc--)
    {
        int h,w;
        cin>>h>>w;
        int max_stones=0;

        for(int i=0;i<h;i++)
            for(int j=0;j<w;j++)
            {
                cin>>arr[i][j];
                if(i>0)
                {
                    a=b=INT_MIN;
                    if(j>0)
                        a=arr[i-1][j-1];
                    if(j<w-1)
                        b=arr[i-1][j+1];
                    arr[i][j]+=max_val(arr[i-1][j],a,b);
                }
                max_stones=max_stones>arr[i][j]?max_stones:arr[i][j];
            }

        cout<<max_stones<<endl;
    }
    return 0;

}

SPOJ - Aggressive Cows (AGGRCOW) Problems Solution

SPOJ -  Aggressive Cows (AGGRCOW) Problems Solution

Solution:-

#include<bits/stdc++.h>
using namespace std;
#define MAX 100010
#define ll long long

ll arr[MAX];
int tc,N,C;

bool func(int mid)
{
    int cows=1,pos=arr[0];

    for(int i=1;i<N;i++)
    {
        if(arr[i]-pos>=mid)
        {
            pos=arr[i];
            cows++;
            if(cows==C)
                return 1;
        }
    }
    return 0;
}

int cal_dist()
{
    int lo,hi,mid,max_dist=-1;
    lo=0;
    hi=arr[N-1];

    while(lo<hi)
    {
        mid=lo+(hi-lo)/2;

        if(func(mid)==1)
        {
            if(mid>max_dist)
                max_dist=mid;
            lo=mid+1;
        }
        else
            hi=mid;
    }
    return max_dist;
}

int main()
{
    cin>>tc;
    while(tc--)
    {
        cin>>N>>C;
        for(int i=0;i<N;i++)
            cin>>arr[i];

        sort(arr,arr+N);

        cout<<cal_dist()<<endl;
    }
    return 0;

}

SPOJ - Longest Path in a Tree Solution

SPOJ - Longest Path in a Tree Solution

Solution:-

#include<bits/stdc++.h>
using namespace std;
#define Edges 10010

vector<int> V[Edges];

bool vis[Edges];
int dist[Edges];

void dfs(int vert,int d)
{
    vis[vert]=true;
    dist[vert]=d;

    for(int u=0;u<V[vert].size();u++)
        if(!vis[V[vert][u]])
            dfs(V[vert][u],d+1);
}

int main()
{
    int n,a,b,i;
    int start_node,max_dist;
    cin>>n;

    for(i=0;i<Edges;i++)
    {
        V[i].clear();
        vis[i]=false;
    }

    for(i=0;i<n-1;i++)
    {
        cin>>a>>b;
        V[a].push_back(b);
        V[b].push_back(a);
    }
    dist[0]=0;

    dfs(1,0);
    start_node=0;

    for(i=1;i<=n;i++)
        if(dist[i]>dist[start_node])
            start_node=i;

    memset(vis,0,sizeof(vis));

    dfs(start_node,0);
    max_dist=0;
    for(i=1;i<=n;i++)
        max_dist=max_dist>dist[i]?max_dist:dist[i];

    cout<<max_dist;
}


Monday, 22 August 2016

SPOJ - Edit Distance Problem Solution - Famous DP problem

SPOJ - Edit Distance Problem Solution - Famous DP problem

Solution:-

#include<bits/stdc++.h>
using namespace std;
#define MAX 2010

int dp[MAX][MAX];

void init(int len)
{
    for(int i=0;i<=len;i++)
        dp[i][0]=dp[0][i]=i;
}

int min_val(int a,int b,int c)
{
    int p=INT_MAX;
    p=p>a?a:p;
    p=p>b?b:p;
    p=p>c?c:p;

    return p;
}

int main()
{
    int tc;
    int len1,len2;
    cin>>tc;
    while(tc--)
    {
        string a,b;
        cin>>a>>b;
        len1=a.length();
        len2=b.length();

        init(max(len1,len2));

        for(int i=1;i<=len1;i++)
            for(int j=1;j<=len2;j++)
            {
                if(a[i-1]==b[j-1])
                    dp[i][j]=dp[i-1][j-1];
                else
                    dp[i][j]=1+min_val(dp[i-1][j-1],dp[i-1][j],dp[i][j-1]);
             }
        cout<<dp[len1][len2]<<endl;
    }
    return 0;
}

Friday, 19 August 2016

SPOJ - AP-Complete The Series Easy Problem Solution

SPOJ - AP-Complete The Series Easy Problem Solution

Solution:-

#include<bits/stdc++.h>
using namespace std;
#define ll long long

int main()
{
    int tc;
    ll third,last_third,sum;
    int n,first,common_diff;
    cin>>tc;
    while(tc--)
    {
        cin>>third>>last_third>>sum;

        n=(2*sum)/(third+last_third);

        common_diff=(last_third-third)/(n-5);

        first=third-(2*common_diff);
        cout<<n<<"\n";
        for(ll i=0;i<n;i++)
            cout<<first+i*common_diff<<" ";
        cout<<"\n";
    }
    return 0;

}

SPOJ - Street Parade Problem Solution (Using Stack)

SPOJ - Street Parade Problem Solution (Using Stack)

Solution:-

#include<bits/stdc++.h>
using namespace std;

int arr[1010];
bool flag;

int main()
{
    int n,prev,index;
    while(1)
    {
        stack<int> s;
        cin>>n;
        if(n==0)
            break;

        for(int i=0;i<n;i++)
            cin>>arr[i];

        prev=index=0;
        flag=false;
        while(index<n)
        {
            if(arr[index]==prev+1)
            {
                prev=arr[index];
                index++;
            }
            else if(s.size() && s.top()==prev+1)
            {
                prev=s.top();
                s.pop();
            }
            else
            {
                s.push(arr[index]);
                index++;
            }
        }
        while(s.size() && s.top()==prev+1)
        {
            prev=s.top();
            s.pop();
        }
        if(!s.size())
            flag=true;

        if(flag)
            cout<<"yes\n";
        else
            cout<<"no\n";

    }
    return 0;

}

Thursday, 18 August 2016

SPOJ- Counting Triangles Solution

SPOJ - Counting Triangles Problem Solution

Solution:-

#include<bits/stdc++.h>
using namespace std;
#define MAX 1000010

long long up[MAX],down[MAX];

void init()
{
    up[1]=1;
    up[2]=4;
    down[2]=1;

    for(int i=3;i<=MAX;i++)
    {
        up[i]=2*up[i-1]+i-up[i-2];
        down[i]=up[i-1]-down[i-1];
    }
}

int main()
{
    init();
    int tc,num;;
    cin>>tc;
    while(tc--)
    {
        cin>>num;
        cout<<up[num]+down[num]<<endl;
    }
    return 0;
}


SPOJ- Army Strength Problem Solution

SPOJ- Army Strength Problem Solution #ad-hoc problem

Solution:-

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int tc;
    string ex;
    cin>>tc;
    getline(cin,ex);
    while(tc--)
    {
        int NG,NM,num;
        int max_NG=-1,max_NM=-1;

        cin>>NG>>NM;

        for(int i=0;i<NG;i++)
        {
            cin>>num;
            max_NG=max_NG>num?max_NG:num;
        }

        for(int i=0;i<NM;i++)
        {
            cin>>num;
            max_NM=max_NM>num?max_NM:num;
        }

        if(max_NM<=max_NG)
            cout<<"Godzilla\n";
        else
            cout<<"MechaGodzilla\n";
        getline(cin,ex);
    }
    return 0;

}

SPOJ- Ambiguous Permutations Problem Solution

SPOJ- Ambiguous Permutations Problem Solution

Solution:-

#include<bits/stdc++.h>
using namespace std;
#define MAX 100010

int arr[MAX];

bool cal_per(int n)
{
    for(int i=1;i<=n;i++)
    {
        if(i!=arr[arr[i]])
            return false;
    }
    return true;
}

int main()
{
    int n;
    while(1)
    {
        cin>>n;
        if(n==0)
            break;

        for(int i=1;i<=n;i++)
            cin>>arr[i];

        if(cal_per(n))
            cout<<"ambiguous\n";
        else
            cout<<"not ambiguous\n";
    }
    return 0;

}

SPOJ - Bytelandian Gold Coins Problem Solution

SPOJ - BYTELANDIAN GOLD COINS (Famous DP Problem) solution

Solution:-

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 100010
ll arr[MAX+5],i,N;

ll cal_max(int N)
{
    if(N<MAX)
        return arr[N];

    else if(N/2+N/3+N/4<=N)
        return N;
    else
        return cal_max(N/2)+cal_max(N/3)+cal_max(N/4);
}

int main()
{
    arr[0]=0;
    arr[1]=1;
    arr[2]=2;
    arr[3]=3;
    for(i=4;i<=MAX;i++)
        arr[i]=max(i,arr[i/2]+arr[i/3]+arr[i/4]);

    while(scanf("%lld",&N)==1)
    cout<<cal_max(N)<<endl;
    return 0;

}

SPOJ- Will It Ever Stop (WILLITST) Problem Solution

SPOJ- Will It Ever Stop (WILLITST) Problem O(1) Solution

Solution:-

#include<bits/stdc++.h>
using namespace std;

int main()
{
    long long int num;
    cin>>num;

    if(num<=1 || !(num&num-1))
        cout<<"TAK";
    else
        cout<<"NIE";

    return 0;

}


SPOJ - Count on Cantor Problem Solution

SPOJ - Count on Cantor (CANTON) Problem Solution

Solution:-

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 5005
#define lim 10000010

ll arr[MAX];

void init()
{
    int i=1;
    while(1)
    {
        arr[i]=i+arr[i-1];
        if(arr[i]>=lim)
            break;
        i++;
    }
}

int main()
{
    init();
    ll tc,num;
    cin>>tc;
    while(tc--)
    {
        cin>>num;
        int i=0;
        while(arr[i]<num)
            i++;

        ll diff=num-arr[i-1];

        cout<<"TERM "<<num<<" IS ";

        if(i%2==0)
            cout<<diff<<"/"<<i+1-diff;
        else
            cout<<i+1-diff<<"/"<<diff;

        cout<<endl;
    }
    return 0;

}

SPOJ - STAMPS Problem Solution

SPOJ - STAMPS Problem Solution


Solution:-

#include<bits/stdc++.h>
using namespace std;
#define MAX 1010

int arr[MAX];
int num_stamps,num_friends;

bool wayToSort(int i, int j) { return i > j; }

int main()
{
    int tc,i,j=0;
    cin>>tc;
    while(tc--)
    {
        j++;
        int index;
        cin>>num_stamps>>num_friends;

        for(i=0;i<num_friends;i++)
            cin>>arr[i];

        sort(arr,arr+num_friends,wayToSort);

        long long int sum=0;
        bool flag=false;

        for(i=0;i<num_friends;i++)
        {
            if(sum>=num_stamps)
            {
                flag=true;
                index=i;
                break;
            }
            sum+=arr[i];
        }

        if(sum>=num_stamps)
        {
            flag=true;
            index=i;
        }

        cout<<"Scenario #"<<j<<":\n";

        if(flag)
            cout<<index<<endl<<endl;
        else
            cout<<"impossible"<<endl<<endl;
    }
    return 0;

}