2014年9月16日 星期二

[UVA] 120 - Stacks of Flapjacks

/*20140917 hanting*/
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    string s;
    while(getline(cin,s))
    {
        stringstream sin(s);
        vector<int> a;
        int num;
        while(sin>>num)
            a.push_back(num);
        int flip[a.size()];
        for(int i=0;i<a.size();i++)
        {
            if(i!=0) cout<<" ";
            cout<<a[i];
            flip[i]=a.size()-i;
        }
        cout<<endl;
        int test_sort=1;
        int largest;
        for(int i=a.size()-1;i>=0 && test_sort;i--)
        {
            test_sort=0;
            largest=i;
            for(int j=0;j<i;j++)//find the largest number
            {
                if(a[j]>a[largest])
                {
                    largest=j;
                }
            }
            if(largest!=i)
            {
                if(largest!=0)//take it to the first
                {
                    cout<<flip[largest]<<" ";
                    reverse(a.begin(),a.begin()+largest+1);
                }
                cout<<flip[i]<<" ";
                reverse(a.begin(),a.begin()+i+1);//and then reverse to i
            }
            for(int j=0;j<a.size()-1;j++)
            {
                if(a[j]>a[j+1])
                {
                    test_sort=1;
                    break;
                }
            }
        }
        cout<<0<<endl;
    }
    return 0;
}

2014年9月12日 星期五

[UVA] 10037 - Bridge

/*20140912 hanting*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    int N;
    cin>>N;
    int blankline=0;
    while(N--)
    {
        if(blankline) cout<<endl;
        int people;
        cin>>people;
        int temp=people;
        vector<int> a(people);
        for(int i=0;i<people;i++)
        {
            cin>>a[i];
        }
        sort(a.begin(),a.end());
        int A,B,C,D;
        A=0;//first
        B=1;//second
        C=people-2;//last second
        D=people-1;//last
        int sum=0;
        while(people)//consider_sum
        {
            if(people==1)
            {
                sum+=a[A];
                people--;
            }
            else if(people==2)
            {
                sum+=a[B];
                people-=2;
            }
            else if(people==3)
            {
                sum+=a[B]+a[A]+a[D];
                people-=3;
            }
            else
            {
                if(a[B]-a[A]>a[C]-a[B])
                {
                    sum+=a[C]+a[A]+a[D]+a[A];
                }
                else
                {
                    sum+=a[B]+a[A]+a[D]+a[B];
                }
                people-=2;
                C=people-2;
                D=people-1;
            }
        }
        cout<<sum<<endl;
        people=temp;
        A=0;//first
        B=1;//second
        C=people-2;//last second
        D=people-1;//last
        while(people)//cout_tread
        {
            if(people==1)
            {
                cout<<a[A]<<endl;
                people--;
            }
            else if(people==2)
            {
                cout<<a[A]<<" "<<a[B]<<endl;
                people-=2;
            }
            else if(people==3)
            {
                cout<<a[A]<<" "<<a[B]<<endl;
                cout<<a[A]<<endl;
                cout<<a[A]<<" "<<a[D]<<endl;
                people-=3;
            }
            else
            {
                if(a[B]-a[A]>a[C]-a[B])
                {
                    cout<<a[A]<<" "<<a[C]<<endl;
                    cout<<a[A]<<endl;
                    cout<<a[A]<<" "<<a[D]<<endl;
                    cout<<a[A]<<endl;
                }
                else
                {
                    cout<<a[A]<<" "<<a[B]<<endl;
                    cout<<a[A]<<endl;
                    cout<<a[C]<<" "<<a[D]<<endl;
                    cout<<a[B]<<endl;
                }
                people-=2;
                C=people-2;
                D=people-1;
            }
        }
        blankline=1;
    }
    return 0;
}

------------------------------

/* 20151030
 * hanting
 * UVa 10037 - Bridge
 * C++
 */
#include <iostream>
#include <vector>
#include <algorithm> //sort
using namespace std;
int solve(int *num, int n);//return sum
vector<pair<int,int> > Go;
vector<int> Back;
int main()
{
    int testCase;
    cin >> testCase;
    while(testCase--)
    {
        Go.clear();
        Back.clear();
        int numN;
        cin >> numN;
        int num[numN];
        for(int i = 0; i < numN; i++)
        {
            cin >> num[i];
        }
        if(numN == 1)
        {
            cout << num[0] << endl;
            cout << num[0] << endl;
        }
        else
        {
            sort(num, num+numN);
            int sum = solve(num, numN);
            cout << sum << endl;
            cout << Go[0].first << " " << Go[0].second << endl;
            for(int i = 1; i < Go.size(); i++)
            {
                cout << Back[i-1] << endl;
                cout << Go[i].first << " " << Go[i].second << endl;
            }
        }
        if(testCase) cout << endl;
    }
    return 0;
}
int solve(int *num, int n)
{
    int sum = 0;
    int i;
    for(i = n-1; i > 2; i-=2)
    {
        int method1 = num[i] + num[0] + num[i-1] + num[0];
        int method2 = num[1] + num[0] + num[i] + num[1];
        if(method1 < method2)
        {
            Go.push_back(pair<int,int>(num[0],num[i]));
            Back.push_back(num[0]);
            Go.push_back(pair<int,int>(num[0],num[i-1]));
            Back.push_back(num[0]);
            sum += method1;
        }
        else
        {
            Go.push_back(pair<int,int>(num[0],num[1]));
            Back.push_back(num[0]);
            Go.push_back(pair<int,int>(num[i-1],num[i]));
            Back.push_back(num[1]);
            sum += method2;
        }
    }
    if(i == 1)
    {
        Go.push_back(pair<int,int>(num[0],num[1]));
        sum += num[1];
    }
    else
    {
        Go.push_back(pair<int,int>(num[0],num[1]));
        Back.push_back(num[0]);
        Go.push_back(pair<int,int>(num[0],num[2]));
        sum += num[1] + num[0] + num[2];
    }
    return sum;
}

2014年8月26日 星期二

[UVA] 353 - Pesky Palindromes

/*20140826 hanting*/
#include <iostream>
using namespace std;
string temp;
inline string intrstr(string s,int start,int End)
{
    int temp=End-start+1;
    return s.substr(start,End-start+1);
}
int palindrome(string s,int left,int right)
{
    int sum=0;
    while(1)
    {
        if(s[left]==s[right] && left>=0 && right<s.size())
        {
            if(temp.find(s.substr(left,right-left+1))>temp.size())
            {
                temp+=s.substr(left,right-left+1);
                temp+=" ";
                sum++;
            }
            left--;
            right++;
        }
        else return sum;
    }
}
int main()
{
    string s;
    while(getline(cin,s))
    {
        temp.clear();
        int ans=0;
        for(int i=0;i<s.size();i++)
        {
            ans+=palindrome(s,i,i);
            if(s[i]==s[i+1])ans+=palindrome(s,i,i+1);
        }
        cout<<"The string '"<<s<<"' contains "<<ans<<" palindromes."<<endl;
    }
    return 0;
}

2014年8月13日 星期三

[UVA] 355 - The Bases Are Loaded

/*20140813 hanting*/
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
string h="0123456789ABCDEF";
string itoa(long long N,int base)
{
    char s[1000];
    int a[1000];
    int i=0;
    while(N>=base)
    {
        a[i++]=N%base;
        N/=base;
    }
    a[i]=N;
    for(int j=0;j<=i;j++)
    {
        s[j]=h[a[i-j]];
    }
    s[++i]=0;
    string str=s;
    return str;
}
long long strtoDec(char* N,int base)
{
    long long a=0;
    for(int i=0;i<strlen(N);i++)
    {
        int temp=h.find(N[strlen(N)-1-i]);
        a+=temp*pow((double)base,i);
    }
    return a;
}
int main()
{
    int base1,base2;
    char N[1000];
    while(cin>>base1>>base2>>N)
    {
        int Continue=0;
        for(int i=0;i<strlen(N);i++)
        {
            if(h.find(N[i])>=base1)
            {
                Continue=1;
                cout<<N<<" is an illegal base "<<base1<<" number"<<endl;
                break;
            }
        }
        if(Continue) continue;
        long long int N_in_Base10;
        N_in_Base10=strtoDec(N,base1);///strtol只能用int範圍
        cout<<N<<" base "<<base1<<" = "<<itoa(N_in_Base10,base2)<<" base "<<base2<<endl;
    }
    return 0;
}

2014年8月12日 星期二

[UVA] 389 - Basically Speaking

/*20140812 hanting*/
#include <iostream>
#include <cstdlib>
#include<cstring>
#include <vector>
#include <iomanip>
using namespace std;
void itoa(int base,int a,char *s)
{
    vector<int> temp;
    char hex[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    while(a>=base)
    {
        temp.push_back(a%base);
        a/=base;
    }
    temp.push_back(a);
    int Size=temp.size();
    for(int i=0;i<Size;i++)
    {
        s[i]=hex[temp.back()];
        temp.pop_back();
    }
    s[Size]=0;
}
int main()
{
    char s[100];
    while(cin>>s)
    {
        int fromBase,toBase;
        cin>>fromBase>>toBase;
        int from;
        from=strtol(s,NULL,fromBase);
        itoa(toBase,from,s);
        if(strlen(s)<=7)
            cout<<setw(7)<<s<<endl;
        else
            cout<<setw(7)<<"ERROR"<<endl;
    }
    return 0;
}

2014年8月6日 星期三

[UVA] 482 - Permutation Arrays

/*20140807 hanting*/
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    int N;
    int blank=0;
    cin>>N;
    while(N--)
    {
        if(blank) cout<<endl;
        vector<int> a;
        do
        {
            int temp;
            cin>>temp;
            a.push_back(temp);
        }while(cin.get()!='\n');
        vector<string> b;
        do
        {
            string temp;
            cin>>temp;
            b.push_back(temp);
        }while(cin.get()!='\n');
        vector<string> ans(a.size());
        for(int i=0;i<a.size();i++)
        {
            ans[a[i]-1]=b[i];
        }
        for(int i=0;i<a.size();i++)
        {
            cout<<ans[i]<<endl;
        }
        blank=1;
    }
    return 0;
}

[UVA] 11204 - Musical instruments

/*20140806 hanting*/
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    int N;
    cin>>N;
    while(N--)
    {
        int m,n;
        cin>>m>>n;
        vector<int> a(m);
        for(int i=0;i<n;i++)
        {
            int temp;
            for(int j=0;j<m;j++)
            {
                cin>>temp;
                if(temp==1) a[j]++;

            }
        }


        int ans=1;
        for(int i=0;i<m;i++)
        {
            if(a[i])ans*=a[i];
        }
        cout<<ans<<endl;
    }
    return 0;
}