Friday, November 19, 2010

ACM-392 Polynomial Showdown with C++


#include <iostream>
#include <sstream>
#include <list>


using namespace std;
string showExponentSP(int temp, int item); //用來處理輸入裡面最先出現的項次
string showExponent(int temp, int item);   //用來處理剩下的項次
//item 表示"項次"
//temp 表示"輸入的值"


int main()
{
    string str = "";
    list<int> l;

    int input;
    int counter = 0;
    int level = 8;

    cin>>input;

    while( cin )
    {
        l.push_back(input);
        counter++;

        if(counter == 9)
        {
            list<int>::iterator iter = l.begin();
            while( iter != l.end() ) {
                if(str.empty())
                {
                    str.append(showExponentSP(*iter,level));
                }
                else
                {
                    str.append(showExponent(*iter,level));
                }
                ++iter;
                level--;
            }

            cout<<str<<endl;
            str.clear();
            l.clear();
            counter = 0;
            level = 8;
        }
        cin>>input;
    }
    return 0;

}



string showExponentSP(int temp, int item)
{
    string s="";
    stringstream ss(s);

    if(item == 0)
    {
        ss<<temp;
    }
    else if(item == 1)
    {
        if (temp == 0)
        {
            ss<<"";
        }
        else
        {
            if(temp == -1)
            ss<<"-x";
            else if(temp == 1)
            ss<<"x";
            else
            ss<<temp<<"x";
        }
    }
    else
    {
        if (temp == 0)
        {
            ss<<"";
        }
        else
        {
            if(temp == -1)
            ss<<"-x^"<<item;
            else if(temp == 1)
            ss<<"x^"<<item;
            else
            ss<<temp<<"x^"<<item;
        }
    }
    return ss.str();
}


string showExponent(int temp, int item)
{
    string s="";
    stringstream ss(s);
    if(item>1)
    {
        if(temp == -1)
        ss<<" - "<<"x^"<<item;
        else if(temp == 1)
        ss<<" + "<<"x^"<<item;
        else if(temp<0)
        ss<<" - "<<(-temp)<<"x^"<<item;
        else if(temp>0)
        ss<<" + "<<temp<<"x^"<<item;
        else
        ss<<"";
    }
    else if(item == 0)
    {
        if(temp<0)
        ss<<" - "<<(-temp);
        else if(temp>0)
        ss<<" + "<<temp;
        else
        ss<<"";
    }else
    {
        if(temp == -1)
        ss<<" - "<<"x";
        else if(temp == 1)
        ss<<" + "<<"x";
        else if(temp<-1)
        ss<<" - "<<(-temp)<<"x";
        else if(temp>1)
        ss<<" + "<<temp<<"x";
        else
        ss<<"";
    }
    //cout<<item<<"  ";
    return ss.str();
}



Sunday, November 7, 2010

ACM-382 Perfection with C++


#include <iostream>
#include <iomanip>
#include <list>

using namespace std;

int sqrts(int test);
void compare(int val, int com);

int main()
{
    int input;
    int result;

    list<int> l;

    cin>>input;
    while(input != 0)
    {
        l.push_back(input);
        cin>>input;
    }

    cout<<"PERFECTION OUTPUT"<<endl;

    list<int>::iterator iter = l.begin();
    while( iter != l.end() ) {
        result = sqrts(*iter);
        compare(*iter, result);
        ++iter;
    }

    cout<<"END OF OUTPUT"<<endl;
    return 0;
}

int sqrts(int test)
{
    int temp = 0;

    for(int i = 1 ; i < test ; i++)
    {
        if(test%i == 0)
        {
            temp = temp + i;
        }
    }
    return temp;
}

void compare(int val, int sum)
{
    if(val > sum)
    cout<<setw(5)<<val<<"  DEFICIENT"<<endl;
    else if(val == sum)
    cout<<setw(5)<<val<<"  PERFECT"<<endl;
    else
    cout<<setw(5)<<val<<"  ABUNDANT"<<endl;
}

Wednesday, September 29, 2010

找因數 with C++


#include <iostream>
#include <sstream>
#include "math.h"
#include <stack>
#include <windows.h>


using namespace std;
void brute(int test);
void sqrts(int test);

int main()
{
    int input;


    cout << "Input a integer" << endl;

    cin>>input;


 LARGE_INTEGER m_liPerfFreq={0};
 QueryPerformanceFrequency(&m_liPerfFreq);
 LARGE_INTEGER m_liPerfStart={0};
 QueryPerformanceCounter(&m_liPerfStart);

    brute(input);

 LARGE_INTEGER liPerfNow={0};
 QueryPerformanceCounter(&liPerfNow);
 long decodeDulation=( ((liPerfNow.QuadPart - m_liPerfStart.QuadPart) * 1000000)/m_liPerfFreq.QuadPart);



 LARGE_INTEGER m_liPerfFreq2={0};
 QueryPerformanceFrequency(&m_liPerfFreq2);
 LARGE_INTEGER m_liPerfStart2={0};
 QueryPerformanceCounter(&m_liPerfStart2);

    sqrts(input);

 LARGE_INTEGER liPerfNow2={0};
 QueryPerformanceCounter(&liPerfNow2);
 long decodeDulation2=( ((liPerfNow2.QuadPart - m_liPerfStart2.QuadPart) * 1000000)/m_liPerfFreq2.QuadPart);



 cout.setf(ios::showpoint, ios::fixed);
 cout.precision (10);

    cout<<decodeDulation<<"  "<<decodeDulation2<<endl;

    return 0;
}


void brute(int test)
{
    string str = "";
    stringstream ss(str);
    for(int i = 1 ; i <= test ; i++)
    {
        if(test%i == 0)
        {
            ss<<i<<"|";
        }
    }
    cout<<ss.str()<<endl;
}



void sqrts(int test)
{
    string str = "";
    stringstream ss(str);
    stack<int> first;

    int temp;
    double sq;

    sq = (int) sqrt(test);

    for(int i = 1 ; i <= sq ; i++)
    {
        if(test%i == 0)
        {
            ss<<i<<"|";
            if(test/i != i)
            {
                first.push(test/i);
            }

        }
    }

    while(!first.empty())
    {
        temp = first.top();
        first.pop();
        ss<<temp<<"|";
    }

    cout<<ss.str()<<endl;
}

Thursday, July 29, 2010

ACM-488 Triangle Wave with C++



#include <iostream>

using namespace std;
void printres(int a);

int main(int argc, char* argv[])
{
int A[100],F[100];
int group;
int temp;

while(cin>>group)
{
for(int i=0 ; i<group ;i++)
{
cin>>A[i]>>F[i];
}

for(int l=0 ; l<group ;l++)
{
for(int n=0; n<F[l] ;n++)
{
temp = A[l];
printres(temp);
if(n<(F[group-1]-1))
cout<<endl;
}
}
}
return 0;
}


void printres(int a)
{
for(int k=1; k<=a ;k++)
{
for(int j=0; j<k ;j++)
{
cout<<k;
}
cout<<endl;
}
for(int m=1 ; m<a ;m++)
{
for(int j=0; j<(a-m) ;j++)
{
cout<<(a-m);
}
cout<<endl;
}
}





難度僅次於ACM100 的3n+1

本題很適合用來練習迴圈(for while)

但是我都用for

本題最難的地方是..................排版 = =a

我也很偷懶

所以直接宣告A[100] F[100]

超級偷懶的 囧

ACM-530 Binomial Showdown with C++


/********************************/
/* This program is used to      */
/*    calculate C(N,R)          */
/*                              */
/*                              */
/* First input is N ,and second */
/* one is R                     */
/* Output is the result of      */
/* C(N,R)                       */
/********************************/

#include <iostream>

using namespace std;
long double calculate(int n , int r);

int main(int argc, char* argv[])
{
 int N,R,temp;
 long double res;
 
 
 while(cin>>N>>R)
 {
  //the situation that stop the program
  if(N==0 && R==0)
  {
   break;
  }
  
  /****************************/
  /*  check                   */
  /*  if N!=R and R > N/2     */
  /*  then C(N,R) = C(N,N-R)  */
  /****************************/
  
  if(N != R && R > (N/2))
  {
   temp = N - R;
  }else
  {
   temp = R;
  }
  
  /* start to caiculate C(N,R) */
  res = calculate(N ,temp);
  printf("%0.Lf\n",res);
 }
 return 0;
}


long double calculate( int n , int r)
{
 long double tempres = 1.0;
 
 if(n == r)
 {
  return 1;
 }
 else if(r == 1)
 {
  return n;
 }
 else if(r ==0)
 {
  return 1;
 }
 else
 {
  for(int i=1 ; i<=r ; i++)
  {
   tempres = (tempres * (n-r+i) / i) ;
  }
  return tempres;
 }
}




幾乎和369是一樣的題目

除了一部分的條件不同

根本是寫一題賺兩題 = =a

ACM-374 Big Mod with C++



/********************************/
/* This program is used to */
/* calculate */
/* R = B^P mod M */
/********************************/


#include <iostream>
#include <ctype.h>
#include <cstdio>
#include <math.h>

using namespace std;
long long M;
long long ans_power(long long a ,long long b);


int main(int argc, char* argv[])
{
long long B,P;
long long res;

while(cin>>B>>P>>M)
{
if(M == 1)
{
res = 0;
}
else if(B == 0 && P == 0) //0^0 = 1
{
res = 1;
}
else if(B == 0 && P != 0) //0^n = 0
{
res = 0;
}
else if(B != 0 && P == 0) //n^0 = 1
{
res = 1;
}
else
{
res = ans_power(B,P) % M;
}
cout<<res<<endl;
}
return 0;
}


long long ans_power(long long a ,long long b)
{
if (b == 0)
{
return 1;
}
else if ((b % 2) == 1)
{
long long foo = ans_power(a, (b/2));
return ((foo * foo * a) % M);
}
else
{
long long foo = ans_power(a, (b/2));
return ((foo * foo) % M);
}
}



本來用for迴圈做

也是吃了TLE

決定切開來mod這樣比較快

不然本來2的300次方

迴圈跑300次

切開之後變成超省時

ACM-369 Combinations with C++


/********************************/
/* This program is used to      */   
/*    calculate C(N,R)          */
/*                              */
/*                              */
/* First input is N ,           */
/*  and second is R             */
/* Output is the result of      */
/* C(N,R)                       */
/********************************/


#include <iostream>
using namespace std;
long double calculate(int n , int r);


int main(int argc, char* argv[])
{
 int N,R,temp;
 long double res;
 
 while(cin>>N>>R)
 {
  //the situation that stop the program
  if(N==0 && R==0)
  {
   break;
  }
  
  /********************************/
  /*  check                       */
  /*  if N!=R and R > N/2         */
  /*  then C(N,R) = C(N,N-R)      */
  /********************************/
  
  if(N != R && R > (N/2))
  {
   temp = N - R;
  }else
  {
   temp = R;
  }
  
  /* start to caiculate C(N,R) */
  res = calculate(N ,temp);
  printf("%d things taken %d at a time is %0.Lf exactly.\n",N,R,res);
 }
 return 0;
}


long double calculate( int n , int r)
{
 long double tempres = 1.0;
 
 if(n == r)
 {
  return 1;
 }
 else if(r == 1)
 {
  return n;
 }
 else
 {
  for(int i=1 ; i<=r ; i++)
  {
   tempres = (tempres * (n-r+i) / i) ;
  }
  return tempres;
 }
}





本來我用遞迴做

馬上就被賞了個TLE

還是乖乖的邊乘邊除

ACM-160 Factors and Factorials with C++

#include<iostream>
#include<stdio.h>
#include<cstdio>

using namespace std;

void funct(int a , int b);

int array[25]={ 2, 3, 5, 7,11,13,
  17,19,23,29,31,37,
  41,43,47,53,59,61,
  67,71,73,79,83,89,97};
  
  
int buffer;
int step;

int main(int argc, char* argv[])
{
 int a;
 int b;
 
 while(cin != NULL)
 {
  cin>>a;
  //store the input
  if(a != 0)
  {
   printf("%3d! =",a);
   b = 0;
   step = 0;
   buffer = 0;
   while(a >= array[b])
   {
    funct(a,b);
    b++;
    if(b == 25)
    break;
   }
  }else
  {
   break;
  }
  printf("\n");
 }
 return 0;
}


void funct(int a , int b)
{
 if(a >= array[b])
 {
  buffer += a/array[b];
  a = a/array[b];
  funct(a,b);
 }else
 {
  step++;
  if(step == 16)
  {
   printf("\n      ");
   step = 1;
  }
  printf("%3d",buffer);
  buffer = 0;
 }
}

ACM-113 Power of Cryptography with C


#include <stdio.h>
#include <math.h>


int main(int argc, char* argv[])
{
 double n,p;
 double k;
 
 while (scanf("%lf %lf", &n, &p) == 2) 
 {
  k = exp(log(p)/n);
  printf("%.0lf\n", k);
 }
 
 return 0;
}

Wednesday, July 21, 2010

ACM-102 Ecological Bin Packing with C++


#include<iostream>
#include<stdio.h>
#include<cstdio>

using namespace std;
string funct(int c1 , int c2 , int c3 , string s_temp , int temp , int temp_max);

 /********************************/
 /* glass[a][b]                  */
 /* a is bucket number           */
 /* b is glass color             */
 /* b = 1 Brown                  */
 /* b = 2 Green                  */
 /* b = 3 Clean                  */
 /********************************/
   


int main(int argc, char* argv[])
{
 unsigned int Bucket[3][3];
 int can_1, can_2, can_3;
 
 while (scanf("%d %d %d %d %d %d %d %d %d", &Bucket[0][0], &Bucket[0][1],
                                            &Bucket[0][2], &Bucket[1][0],
                                            &Bucket[1][1], &Bucket[1][2],
                                            &Bucket[2][0], &Bucket[2][1],
                                            &Bucket[2][2]) != EOF)
 {
  /* initiate */
  unsigned int max = 0 , move = 0;
  int init = 0, total = 0, temp_total = 0;
  string s_goal = "XXX";
  for(int i=0 ; i<3 ; i++)
  {
   for(int j=0 ; j<3 ; j++)
   {
    total = total + Bucket[i][j];
   }
  }
  
  for(can_1=0 ; can_1<3 ; can_1++)
  {
   init = Bucket[0][can_1];
   temp_total =  Bucket[0][can_1];
   for(can_2=0 ; can_2<3 ; can_2++)
   {
    if(can_1 != can_2)
    {
     temp_total = temp_total + Bucket[1][can_2];
     for(can_3=0 ; can_3<3 ; can_3++)
     {
      if( (can_3 != can_2) && (can_3 != can_1) )
      {
       temp_total = temp_total + Bucket[2][can_3];
       if(temp_total >= max)
       {
        s_goal = funct(can_1 , can_2 , can_3 , s_goal , temp_total , max);
        max = temp_total;
       }
       temp_total = init;
      }
     }
    }
   }
         
  }
  
  move = total - max;
  cout<< s_goal << " " << move <<endl;
 }
 
 return 0;
}


string funct(int c1 , int c2 , int c3 , string s_temp , int temp , int temp_max)
{
 string str="";
 int size = 0;

 if(c1==0){  
  str=str+"B";  
 }else if(c1==1){  
  str=str+"G";  
 }else 
  str=str+"C";  
     
 if(c2==0){  
  str=str+"B";  
 }else if(c2==1){  
  str=str+"G";  
 }else 
  str=str+"C";     
      
 if(c3==0){  
  str=str+"B";  
 }else if(c3==1){  
  str=str+"G";  
 }else 
  str=str+"C";
  
 if(temp == temp_max)
 {
  while(size < 2)
  {
   if(str[size] < s_temp[size])
    return str;
   else if(str[size] > s_temp[size])
    break;
   else
    size++;
  }  
  return s_temp;
 }   
 
 return str;
}

Monday, July 19, 2010

ACM-101 The Blocks Problem with C++

經過了3天的激戰

順利的擊敗了ACM-101

執行時間0.020 排名2901

神人好多阿

#include <sstream>
#include <iostream>
#include <stdio.h>
#include <ctype.h>
#include <cstdio>
#include <list>

using namespace std;

list <int> block[25];  // 25 stack
int pos[25];  // if block 1 is in the stack and the base block is 5 then pos[1] = 5;


void initiate();
void printresult(int x);
void moveonto(int a , int b);
void moveover(int a , int b);
void pileonto(int a , int b);
void pileover(int a , int b);
bool checkblock(int a , int b);


int main(int argc, char* argv[])
{
 int block_1, block_2;
 int final;


 string str1, str2;
 string quit = "quit";
 string move = "move";
 string pile = "pile"; 
 string onto = "onto"; 
 string over = "over"; 
 
 while( cin>>str1 )
 {
  if(str1 == quit)//print the final result
  {
   printresult(final);                  
  }else if(str1 == move || str1 == pile) // move and pile action
  {
   cin >> block_1 >> str2 >> block_2;
   if(block_1 != block_2 && checkblock(block_1 , block_2))
   {
    if(str1 == move)
    {
     if(str2 == onto)
     {
      moveonto(block_1 , block_2);
     }else
     {
      moveover(block_1 , block_2);
     }
    }else
    {
     if(str2 == onto)
     {
      pileonto(block_1 , block_2);
     }else
     {
      pileover(block_1 , block_2);
     }
    }           
   }else
   {
    //cout<<"Are you kidding"<<endl;
   }               
  }else  // how many blocks are used in the process
  {
   istringstream stream1;
   stream1.str(str1);
   stream1 >> final;
   initiate();
  }
 }
 return 0;
}


void initiate()
{
 for(int i=0 ; i<25 ; i++)
 {
  if(block[i].empty())
  {
   block[i].push_back(i);
   pos[i] = i;
  }else
  {
   block[i].clear();
   block[i].push_back(i);
   pos[i] = i;
  }
 }
}


void printresult(int x)
{
 list<int>::iterator iter2;
 for(int y=0 ; y<x ; y++)
 {
  iter2 = block[y].begin();
  cout << y <<":";
  while( iter2 != block[y].end() ) 
  {
   cout <<" "<<*iter2;
   ++iter2;
  } 
  cout<<endl;
 }
}


bool checkblock(int a , int b)
{
 if(pos[a] != pos[b])
 return true;
 else
 return false;     
}



void moveonto(int a , int b)
{
 int temp_pos1, temp_pos2;
 //use to present the target block's position; 
 //if the target block is "3" and the stack is "1 2 3" ; then temp_pos = 1
 
 int bpos1, bpos2;                  
 //use to present the last block in the stack; 
 //if the stack is "1 2 3" then bpos = 3
 
 /*** put the block back ***/     
 temp_pos1 = pos[a];                //where is the block a 
 bpos1 = block[temp_pos1].back();   //the last block in the stack a
 
 temp_pos2 = pos[b];                //where is the block b
 bpos2 = block[temp_pos2].back();   //the last block in the stack b
 
 while(bpos1 != a)  //put the last block back 
 {
  block[bpos1].push_back(bpos1);
  pos[bpos1] = bpos1;
  block[temp_pos1].pop_back();
  bpos1 = block[temp_pos1].back();
 }
 
 while(bpos2 != b)  //put the last block back
 {
  block[bpos2].push_back(bpos2);
  pos[bpos2] = bpos2;
  block[temp_pos2].pop_back();
  bpos2 = block[temp_pos2].back();
 }
 
 /*** move the first block onto the second block ***/          
 block[temp_pos1].pop_back();     
 block[temp_pos2].push_back(a);
 pos[a] = temp_pos2;
}

void moveover(int a , int b)
{
 int temp_pos1, temp_pos2;
 //use to present the target block's position; 
 //if the target block is "3" and the stack is "1 2 3" ; then temp_pos = 1
 
 int bpos1;
 //use to present the last block in the stack; 
 //if the stack is "1 2 3" then bpos = 3
 
 /*** put the block back ***/     
 temp_pos1 = pos[a];                //where is the block a 
 bpos1 = block[temp_pos1].back();   //the last block in the stack a
 
 temp_pos2 = pos[b];                //where is the block b
      
 while(bpos1 != a)  //put the last block back 
 {
  block[bpos1].push_back(bpos1);
  pos[bpos1] = bpos1;
  block[temp_pos1].pop_back();
  bpos1 = block[temp_pos1].back();
 }
 
 /*** move the first block onto the second block ***/          
 block[temp_pos1].pop_back();     
 block[temp_pos2].push_back(a);
 pos[a] = temp_pos2;
}

void pileonto(int a , int b)
{
 int temp_pos1, temp_pos2;
 //use to present the target block's position; 
 //if the target block is "3" and the stack is "1 2 3" ; then temp_pos = 1
 
 int bpos2;
 //use to present the last block in the stack; 
 //if the stack is "1 2 3" then bpos = 3
 
 list<int> mylist;
 list<int>::iterator it;
 
 /*** put the block back ***/     
 temp_pos1 = pos[a];                //where is the block a 
 //bpos1 = block[temp_pos1].back();   //the last block in the stack a
 
 temp_pos2 = pos[b];                //where is the block b
 bpos2 = block[temp_pos2].back();   //the last block in the stack b
 
 for(it=block[temp_pos1].begin() ; it!=block[temp_pos1].end() ; it++)
 {
  if(*it == a)
  {
   mylist.splice ( mylist.begin(), block[temp_pos1], it, block[temp_pos1].end());
   break;
  }
 }
 
 
 while(bpos2 != b)  //put the last block back
 {
  block[bpos2].push_back(bpos2);
  pos[bpos2] = bpos2;
  block[temp_pos2].pop_back();
  bpos2 = block[temp_pos2].back();
  //cout<<"*";
 }
 
 
 block[temp_pos2].splice(block[temp_pos2].end(),mylist);
 for(it=block[temp_pos2].begin() ; it!=block[temp_pos2].end() ; it++)
      {
  pos[*it] = temp_pos2;
 }
 pos[a] = temp_pos2;
}

void pileover(int a , int b)
{
 int temp_pos1, temp_pos2;
 //use to present the target block's position; 
 //if the target block is "3" and the stack is "1 2 3" ; then temp_pos = 1
 
 //int bpos1, bpos2;
 //use to present the last block in the stack; 
 //if the stack is "1 2 3" then bpos = 3
 
 list<int> mylist;
 list<int>::iterator it;
 
 /*** put the block back ***/     
 temp_pos1 = pos[a];                //where is the block a 
 //bpos1 = block[temp_pos1].back();   //the last block in the stack a
 
 temp_pos2 = pos[b];                //where is the block b
 //bpos2 = block[temp_pos2].back();   //the last block in the stack b
 
 for(it=block[temp_pos1].begin() ; it!=block[temp_pos1].end() ; it++)
 {
  if(*it == a)
  {
   mylist.splice ( mylist.begin(), block[temp_pos1], it, block[temp_pos1].end());
   break;
  }
 }
 
 block[temp_pos2].splice(block[temp_pos2].end(),mylist);
 for(it=block[temp_pos2].begin() ; it!=block[temp_pos2].end() ; it++)
 {
  pos[*it] = temp_pos2;
 }
 pos[a] = temp_pos2;
}

Saturday, July 17, 2010

ACM-100 The 3n + 1 problem with C++


#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
 int a,b;
 int start,end;
 int temp,count;
 int max;

 while(cin >> a >> b)
 {
  //cout << a << b << endl;
  if(a > b)
  {
   start = b;
   end = a;
  }else
  {
   start = a;
   end = b;
  }

  max = 0;

  for(int k = start; k <= end ; k++)
  {
   temp = k;
   count = 1;
   while(temp!=1)
   {
    ++count;
    if(temp%2 ==1)
    {
     temp = 3 * temp + 1;
    }else
    {
     temp = temp / 2;
    }
   }

   if(max < count)
   {
    max = count;
   }
  }
  cout >> a >> " " >> b >> " " >> max >> endl;
 }

 return 0;
}

TEST



public class HelloWorld{
public static void main(String args[]){
System.out.println("Hello World!");
}
}