Thursday, 25 May 2017

UVA 136 - Ugly Numbers

Problem : Ugly Numbers
Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 
1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, ... 
shows the first 11 ugly numbers. By convention, 1 is included. 
Write a program to find and print the 1500'th ugly number. 

Input and Output
There is no input to this program. Output should consist of a single line as shown below, with <number> replaced by the number computed. 

Sample output
The 1500'th ugly number is <number>. 

My accepted code is given below:
#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long a,b,c,n,i,ar[1599]={0},x,y,z;
    a=b=c=n=1;
    ar[1]=1;
    while(n!=1501)
    {
        //cout<<ar[n]<<endl;
        x=2*ar[a];
        y=3*ar[b];
        z=5*ar[c];
        ar[++n]=min(x,min(y,z));
        if(ar[n]==x)
            a++;
        if(ar[n]==y)
            b++;
            if(ar[n]==z)
            c++;
    }
    cout<<"The 1500'th ugly number is "<<ar[1500]<<"."<<endl;
}

Wednesday, 10 May 2017

UVA 567 - Risk

Problem:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=508

Risk :

Risk is a board game in which several opposing players attempt to conquer the world. The gameboard consists of a world map broken up into hypothetical countries. During a player's turn, armies stationed in one country are only allowed to attack only countries with which they share a common border. Upon conquest of that country, the armies may move into the newly conquered country.

During the course of play, a player often engages in a sequence of conquests with the goal of transferring a large mass of armies from some starting country to a destination country. Typically, one chooses the intervening countries so as to minimize the total number of countries that need to be conquered. Given a description of the gameboard with 20 countries each with between 1 and 19 connections to other countries, your task is to write a function that takes a starting country and a destination country and computes the minimum number of countries that must be conquered to reach the destination. You do not need to output the sequence of countries, just the number of countries to be conquered including the destination. For example, if starting and destination countries are neighbors, then your program should return one.

The following connection diagram illustrates the first sample input.

Input
Input to your program will consist of a series of country configuration test sets. Each test set will consist of a board description on lines 1 through 19. The representation avoids listing every national boundary twice by only listing the fact that country I borders country J when I < J. Thus, the Ith line, where I is less than 20, contains an integer X indicating how many ``higher-numbered" countries share borders with country I, then X distinct integers J greater than I and not exceeding 20, each describing a boundary between countries I and J. Line 20 of the test set contains a single integer (  ) indicating the number of country pairs that follow. The next N lines each contain exactly two integers (  ) indicating the starting and ending countries for a possible conquest.

There can be multiple test sets in the input file; your program should continue reading and processing until reaching the end of file. There will be at least one path between any two given countries in every country configuration.

Output
For each input set, your program should print the following message ``Test Set #T" where T is the number of the test set starting with 1 (left-justified starting in column 11).
The next NT lines each will contain the result for the corresponding test in the test set - that is, the minimum number of countries to conquer. The test result line should contain the start country code A right-justified in columns 1 and 2; the string `` to " in columns 3 to 6; the destination country code B right-justified in columns 7 and 8; the string ``: " in columns 9 and 10; and a single integer indicating the minimum number of moves required to traverse from country A to country B in the test set left-justified starting in column 11. Following all result lines of each input set, your program should print a single blank line.

Sample Input
1 3
2 3 4
3 4 5 6
1 6
1 7
2 12 13
1 8
2 9 10
1 11
1 11
2 12 17
1 14
2 14 15
2 15 16
1 16
1 19
2 18 19
1 20
1 20
5
1 20
2 9
19 5
18 19
16 20
4 2 3 5 6
1 4
3 4 10 5
5 10 11 12 19 18
2 6 7
2 7 8
2 9 10
1 9
1 10
2 11 14
3 12 13 14
3 18 17 13
4 14 15 16 17
0
0
0
2 18 20
1 19
1 20
6
1 20
8 20
15 16
11 4
7 13
2 16

Sample Output
Test Set #1
 1 to 20: 7
 2 to  9: 5
19 to  5: 6
18 to 19: 2
16 to 20: 2

Test Set #2
 1 to 20: 4
 8 to 20: 5
15 to 16: 2
11 to  4: 1
 7 to 13: 3
 2 to 16: 4

My accepted code is given below:

Code:
#include<bits/stdc++.h>
using namespace std;
long long bsf(long long start,long long end,map<long long,vector<long long> >vec)
{
    map<long long,long long>visit,lebel;
    long long frnt,l,i,v;
    visit[start]=1;
    queue<long long>q;
    q.push(start);
    lebel[start]=0;
    while(!q.empty())
    {
        frnt=q.front();
        //cout<<frnt<<"->";
        q.pop();
        l=vec[frnt].size();
        for(i=0; i<l; i++)
        {
            v=vec[frnt][i];
            if(visit[v]==0)
            {
                visit[v]=1;
                q.push(v);
                lebel[v]=lebel[frnt]+1;
            }
        }
    }
    return lebel[end];
}
int main()
{
    long long n,i,a,m,x,j,y,c=1,k,nn;
    while(cin>>n)
    {
        map<long long,vector<long long> >vec;
       // cout<<"AAA"<<endl;
        for(i=0; i<n; i++)
        {
            cin>>a;
            vec[1].push_back(a);
            vec[a].push_back(1);
            //cout<<"kj";
        }
        for(i=2; i<=19; i++)
        {
            cin>>nn;
            for(j=0; j<nn; j++)
            {
                cin>>a;
                vec[i].push_back(a);
                vec[a].push_back(i);
            }
        }
        cout<<"Test Set #"<<c++<<endl;
        cin>>m;

        for(k=0; k<m; k++)
        {
            cin>>x>>y;
            //cout<<"dsjn"<<endl;
            printf("%2lld",x);
            cout<<" to ";
            printf("%2lld",y);
            cout<<": "<<bsf(x,y,vec)<<endl;
        }
        cout<<endl;
    }
}
/*
1 3
2 3 4
3 4 5 6
1 6
1 7
2 12 13
1 8
2 9 10
1 11
1 11
2 12 17
1 14
2 14 15
2 15 16
1 16
1 19
2 18 19
1 20
1 20
5
1 20
2 9
19 5
18 19
16 20
4 2 3 5 6
1 4
3 4 10 5
5 10 11 12 19 18
2 6 7
2 7 8
2 9 10
1 9
1 10
2 11 14
3 12 13 14
3 18 17 13
4 14 15 16 17
0
0
0
2 18 20
1 19
1 20
6
1 20
8 20
15 16
11 4
7 13
2 16
*/

Saturday, 29 April 2017

Educational Codeforces Round 20/B. Distances to Zero

B. Distances to Zero
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
You are given the array of integer numbers a0, a1, ..., an - 1. For each element find the distance to the nearest zero (to the element which equals to zero). There is at least one zero element in the given array.
Input
The first line contains integer n (1 ≤ n ≤ 2·105) — length of the array a. The second line contains integer elements of the array separated by single spaces ( - 109 ≤ ai ≤ 109).
Output
Print the sequence d0, d1, ..., dn - 1, where di is the difference of indices between i and nearest j such that aj = 0. It is possible that i = j.
Examples
input
9
2 1 0 3 0 0 3 2 4
output
2 1 0 1 0 0 1 2 3 
input
5
0 1 2 3 4
output
0 1 2 3 4 
input
7
5 6 0 1 -2 3 4
output
2 1 0 1 2 3 4 
Solve:
#include<bits/stdc++.h>
using namespace std;

vector<long long>vec;
int main()
{
    long long n,i,c,j,a,in;
    while(cin >>n)
    {
        for(i=0; i<n; i++)
        {
            cin>>in;
            vec.push_back(in);
        }
        if(n==1)
            cout<<0;
        else
            for(i=0; i<n; i++)
            {

                c=1;
                //cout<<"f;kasj";
                if(i!=0)
                    cout<<" ";
                while(c<n)
                {

                    if(vec[i]==0)
                    {
                        cout<<0;
                        break;
                    }
                    else if(vec[i+c]==0&&i+c<n)
                    {
                        cout<<c;
                        break;
                    }
                    else if(vec[i-c]==0&&i-c>=0)
                    {
                        cout<<c;
                        break;
                    }
                    c++;
                }
            }
        cout<<endl;
    }
    return 0;
}

এই প্রবলেম টা যদি আমরা এভাবে সল্ভ করি তাহলে time limit হওয়ার সম্ভাবনা থাকে।
সে জন্য নিচের নিয়মে করতে হবে।
#include<bits/stdc++.h>
using namespace std;

int main()
{
    long long n,i,a,mn,c,cc;
    while(cin>>n)
    {
        vector<long long>vec,v;
        cc=0;
        for(i=0; i<n; i++)
        {
            cin>>a;
            vec.push_back(a);
            if(a==0)
            {
                v.push_back(i);
                cc++;
            }

        }
        c=0;
        for(i=0; i<n; i++)
        {
           // if(c+1<=cc)
             //   v.push_back(-9);
             //cout<<i<<" bbb "<<v[c]<<" nbn "<<v[c+1]<<endl;
             //if(v[c+1]!=0
            mn=min(abs(i-v[c]),abs(i-v[c+1]));
            cout<<mn;
            if(i==v[c+1])
                c++;
            if(i!=n-1)
                cout<<" ";
        }
        cout<<endl;
    }
    return 0;
}

Thursday, 27 April 2017

UVA 10004

Problem: Bicoloring
In 1976 the ``Four Color Map Theorem" was proven with the assistance of a computer. This theorem states that every map can be colored using only four colors, in such a way that no region is colored using the same color as a neighbor region.
Here you are asked to solve a simpler similar problem. You have to decide whether a given arbitrary connected graph can be bicolored. That is, if one can assign colors (from a palette of two) to the nodes in such a way that no two adjacent nodes have the same color. To simplify the problem you can assume:
no node will have an edge to itself.
the graph is nondirected. That is, if a node a is said to be connected to a node b, then you must assume that b is connected to a.
the graph will be strongly connected. That is, there will be at least one path from any node to any other node.
Input
The input consists of several test cases. Each test case starts with a line containing the number n ( 1 < n < 200) of different nodes. The second line contains the number of edges l. After this, l lines will follow, each containing two numbers that specify an edge between the two nodes that they represent. A node in the graph will be labeled using a number a (  ).
An input with n = 0 will mark the end of the input and is not to be processed.
Output
You have to decide whether the input graph can be bicolored or not, and print it as shown below.
Sample Input
3
3
0 1
1 2
2 0
9
8
0 1
0 2
0 3
0 4
0 5
0 6
0 7
0 8
0
Sample Output
NOT BICOLORABLE.
BICOLORABLE.

My accepted code :

#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long n,m,i,a,b,visited[40009],color[40009],top,c,d,f,st;
    while(cin>>n>>m)
    {
        vector<long long> vec[209];
        for(i=0; i<m; i++)
        {
            cin>>a>>b;
            vec[a].push_back(b);
            vec[b].push_back(a);
        }
        long long start=0;
        queue<long long>q;
        memset(visited,0,sizeof visited);
        memset(color,0,sizeof color);
        visited[0]=1;
        q.push(start);
        c=0;
        color[start]=1;
        while(!q.empty())
        {
            top=q.front();
            cout<<top<<"->";
            q.pop();
            c++;
            if(color[top]==1)
                    d=2;
                else
                    d=1;
                    f=0;
            for(i=)
            {
                st=vec[it];
                cout<<"g"<<st<<endl;
                /*if(color[top]==color[st])
                {
                    f=1;
                    break;
                }
                if(visited[*it]==0)
                {
                    visited[*it]=1;
                    q.push(*it);
                    color[*it]=d;
                }*/
            }
        }
        c--;
       // cout<<n<<"   vbjmvnb "<<c<<endl;
        if(f==1)
            cout<<"NOT BICOLORABLE.\n";

        else
            cout<<"BICOLORABLE.\n";

    }
    return 0;
}

Thursday, 9 February 2017

uva 10812 - Beat the Spread!

Problem:uva 10812 - Beat the Spread!
Superbowl Sunday is nearly here. In order to pass the time waiting
for the half-time commercials and wardrobe malfunctions, the local
hackers have organized a betting pool on the game. Members place
their bets on the sum of the two nal scores, or on the absolute
difference between the two scores.
Given the winning numbers for each type of bet, can you deduce
the nal scores?
Input
The rst line of input contains n, the number of test cases. n lines
follow, each representing a test case. Each test case gives s and d,
non-negative integers representing the sum and (absolute) difference between the two nal scores.
Output
For each test case, output a line giving the two nal scores, largest rst. If there are no such scores,
output a line containing \impossible". Recall that football scores are always non-negative integers.
Sample Input
2
40 20
20 40
Sample Output
30 10
impossible
Code:
#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long a,b,t,aa,bb;
    cin>>t;
    while(t--)
    {
        cin>>a>>b;
        aa=(a+b)/2;
        bb=(a-b)/2;
        if((a+b)%2!=0||a<b)
            cout<<"impossible"<<endl;
        else
            cout<<aa<<" "<<bb<<endl;
           // else

    }
    return 0;
}

Friday, 3 February 2017

uva 113 - Power of Cryptography

Problem: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=24&problem=49&mosmsg=Submission+received+with+ID+18722967
Code:
#include<bits/stdc++.h>
using namespace std;
int main()
{
    double a,b;
    while(cin>>a>>b)
    {
        //cout<<b<<a<<endl;
        //cout<<<<endl;

        printf("%.0lf\n",pow(b,1/a));
    }
    return 0;
}

UVA 11461 - Square Numbers

Problem: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=24&problem=2456&mosmsg=Submission+received+with+ID+18720652

Code:
#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long a,b,c,aa,bb;
    long long i;
    while(cin>>a>>b)
    {
        aa=sqrt(a);
        bb=sqrt(b);
        if(a==0&&b==0)
            break;
            if(aa*aa==a)
                aa--;

        cout<<bb-aa<<endl;
    }
    return 0;

}