網頁

顯示具有 高中生程式解題系統ZeroJudge 標籤的文章。 顯示所有文章
顯示具有 高中生程式解題系統ZeroJudge 標籤的文章。 顯示所有文章

2014年2月24日 星期一

c048: Ant on a Chessboard

 #include <stdio.h>
 #include <math.h> 
 
 int main(int argc, char *argv[])
 {
        int N ; 
        int layer ; 
        int base ; 
        int displace ; 
        int coor[2] ; 
        while(scanf("%d",&N) && N){
                N-- ; 
                layer = floor(sqrt(N))+1; 
                base = layer*(layer-1) ; 
                displace = N-base ; 
                coor[0] = coor[1] = layer ; 
 
                if(layer%2 == 1) 
                        if(displace > 0)
                                coor[0] -= displace ; 
                        else
                                coor[1] += displace ;
                else
                        if(displace > 0) 
                                coor[1] -= displace ; 
                        else
                                coor[0] += displace ; 
                printf("%d %d\n", coor[0], coor[1]) ;  
        }
        return 0;
 }

2014年2月7日 星期五

UVA 10235 - Simply Emirp

 #include <iostream>
 #include <cstdio>
 #include <vector>
 #include <sstream>
 #include <algorithm>
 #include <bitset>
 #define MAX 1000000
 using namespace std;
 
 bitset<MAX+1> bs;
 
 void seive(){
   bs.set();
   bs[0]=false, bs[1]=false;
   
   for (long long int i=2; i<=bs.size(); ++i){
     if (bs[i]==true){
       for (long long int j=i*i; j<bs.size(); j+=i) 
         bs[j]=false;
     }
   }
   return; 
 }
 
 int main(int argc, char *argv[]){
   seive();
   
   int num, renum, tmp;
   while(cin>>num){
     tmp = num;
     for (renum=0; tmp; tmp/=10){
       renum = renum*10+(tmp%10);
     }
    if (bs[num]==true){
      if (bs[renum]==true && num!=renum){
        printf("%d is emirp.\n", num);
      } else {
        printf("%d is prime.\n", num);
      }
    } else {
      printf("%d is not prime.\n", num);
    }
  }
  return 0;
}

2014年2月6日 星期四

UVA 11150 - Cola

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main(int argc, char *argv[]){
  int n;
  while(cin>>n){
    int total=n;
    int empty=n;
    int remain;

    while (empty>=3){
      remain = empty/3; 
      empty = empty%3;
       total += remain;
       empty += remain;
     }
 
     if (empty==2){
       total++;
     } 
     
     cout << total << endl;
   }
   return 0;
 }

UVA 299 - Train Swapping

 /* just like bubble sort swapping times */
 #include <iostream>
 #include <algorithm>
 using namespace std;
 
 int main(int argc, char *argv[]){
   int t;
   cin >> t;
   int train[51];
   while(t--){
     int length;
     int count=0;
     cin >> length;
     for (int i=0; i<length; ++i){
       cin >> train[i];
     }
 
     for (int i=0; i<length-1; ++i){
       for (int j=0; j<length-i-1; ++j){
         if (train[j]>train[j+1])
           swap(train[j], train[j+1]), count++;
       }
     }
     cout << "Optimal train swapping takes " << count << " swaps." << endl;
   }
   return 0;
 }

UVA 10062 - Tell me the frequencies!

 #include <iostream>
 #include <string>
 #include <vector>
 #include <map>
 #include <algorithm>
 
 using namespace std;
 
 class Freq{
  public:
   Freq(char ansii, int count){
     this->ansii = ansii;
     this->count = count;
   }
   char ansii;
   int count;
 };
 
 bool FreqCompare (const Freq &a, const Freq &b){
   if (a.count!=b.count){
     return a.count<b.count;
   } else {
     return a.ansii>b.ansii;
   }
 }
 
 int main(int argc, char *argv[]){
   map<char, int> m;
   map<char, int>::iterator it;
   vector<Freq> freq;
   string line;
   bool firstTime=true;
   while (getline(cin, line)){
     m.clear();
     freq.clear();
     
     for (int i=0; i<line.size(); ++i){
       it = m.find(line[i]);
       (it == m.end()) ? m[line[i]]=1 : m[line[i]]++;  
    }
    
    for (it=m.begin(); it!=m.end(); ++it){
      freq.push_back(Freq(it->first, it->second));
    }

    sort(freq.begin(), freq.end(), FreqCompare);
    firstTime ? firstTime=false : cout << endl ;
    for (int i=0; i<freq.size(); ++i){
      cout << (size_t) freq[i].ansii << " " << freq[i].count << endl;
    }
  }
  return 0;
}

UVA 543 - Goldbach's Conjecture

 /* use seive method to generate the table of prime number 
    reference: http://www.cnblogs.com/xiaobaibuhei/p/3329702.html
    http://maplewing.blogspot.tw/2011/02/uva543goldbachs-conjecture.html*/
  
 #include <iostream>
 #include <vector>
 #include <bitset>
 #define MAX 1000000
 using namespace std;
 
 bitset<MAX+1> bs;
 vector<int> primes;
   
 void seive(){
   bs.set(); // set all bit to 1
   bs[0]=false, bs[1]=false;
 
   for (long long int i=2; i<=MAX; ++i){
     if (bs[i]==true){
       for (long long int j=i*i; j<=MAX; j+=i)
         bs[j]=false;
       primes.push_back(i);
     }
   }
   return;
 }
 
 int main(int argc, char *argv[]){
   seive();
   int n;
   while(cin>>n && n){
     for (int i=0; i<primes.size(); ++i){
       if (bs[primes[i]]==true && bs[n-primes[i]]==true){
         cout << n << " = " << primes[i] << " + " << n-primes[i] << endl;
         break;
       }
     }
   }
   return 0;
}

2014年2月5日 星期三

UVA 10226 - Hardwood Species

 #include <iostream>
 #include <cstdio>
 #include <iomanip>
 #include <string> 
 #include <map>
 #include <algorithm>
 
 using namespace std;
 
 int main(int argc, char *argv[]){
   int t;
   string line;
   cin >> t;
   getline(cin, line); // read new line
   getline(cin, line); // read new line
   while (t--){
     map<string, int> m;
     map<string, int>::iterator it;
     int count=0 ;
     while (getline(cin, line)){
       if (line=="") break;
       it = m.find(line);
       if (it == m.end()){
         m[line] = 1;
       } else {
         it->second++;
       }
       count++;
     }
     
     for (it=m.begin(); it!=m.end(); ++it){
       float percent = 100.0*it->second/count;
       cout  << it->first << ' ' << fixed << setprecision(4) << percent << endl;
     }
 
     if (t>0) cout << endl ;
     
   }
   return 0;
}

2013年12月4日 星期三

c048: Ant on a Chessboard、UVA 10161

 (defun calc-coor (sec) 
   "計算座標函式"
   (if (equal sec 0) 
       (return-from calc-coor))
   ;; 把方格從0秒開始計算
   ;; 再以斜線上的點作為基準(base) 
   ;; 最後計算 基準+位移 即為所求
   (let* (( sec (- sec 1))
         (layer (+ (floor (sqrt sec)) 1))
         (base (* layer (- layer 1)))
         (displace (- sec base))
         (coor (list layer layer)))
     (if (equal (rem layer 2) 1)
        (if (> displace 0) 
            (decf (first coor) displace) 
            (incf (second coor) displace))
         (if (> displace 0) 
            (decf (second coor) displace)
            (incf (first coor) displace)))
     coor
     ))
  
 (defun chess-board ()
   (do ((sec (read) (read))) 
       ((<= sec 0) )
     (format t "~A~%" (calc-coor sec))))  
 
 (chess-board) 
 #include <stdio.h>
 #include <math.h> 
 
 int main(int argc, char *argv[])
 {
        int N ; 
        int layer ; 
        int base ; 
        int displace ; 
        int coor[2] ; 
        while(scanf("%d",&N) && N){
                N-- ; 
                layer = floor(sqrt(N))+1; 
                base = layer*(layer-1) ; 
                displace = N-base ; 
                coor[0] = coor[1] = layer ; 
 
                if(layer%2 == 1) 
                        if(displace > 0)
                                coor[0] -= displace ; 
                        else
                                coor[1] += displace ;
                else
                        if(displace > 0) 
                                coor[1] -= displace ; 
                        else
                                coor[0] += displace ; 
                printf("%d %d\n", coor[0], coor[1]) ;  
        }
        return 0;
 }
 
題目連結:http://zerojudge.tw/ShowProblem?problemid=c048

2013年12月2日 星期一

c045: Rotating Sentences、UVA 490

 #include <stdio.h>
 #include <string.h> 
 #define MAX 101
 char arr[MAX][MAX] ;
 
 int main(int argc, char *argv[])
 {
        memset(arr, '\0', sizeof(arr) ) ; 
        int i, j ;
        int rows = 0; 
        int cols = 0 ; 
        for (i=0; fgets(arr[i], sizeof(arr[i]), stdin) != NULL ; ++i) 
                rows++ ; 
 
        char *pos ; 
        for (i=0 ; arr[i][0]!='\0'; ++i)
        {
                if ((pos=strchr(arr[i], '\n')) != NULL)
                        *pos = '\0';
                if (strlen(arr[i]) > cols)
                        cols = strlen(arr[i]) ; 
        }
        /* 字串由左下開始輸出,先向上輸出,再向右輸出 */ 
        for (i=0; i<cols; ++i)
        {
                for (j=rows-1; j>=0 ; --j) 
                        printf("%c",(arr[j][i]=='\0'?' ':arr[j][i])) ;
                puts("") ; 
        }
 
        return 0;
 }
 (defparameter arr (make-array '(100) :initial-element nil))
 (defparameter rows 0) 
 (defparameter cols 0) 
 
 (defun read-lines () 
 "read lines until eof" 
   (do ((i 0 (incf i) )
        (line (read-line *standard-input* nil 'eof)
             (read-line *standard-input* nil 'eof)))
       ((eql line 'eof) i)
     (setf (aref arr i) line)))
 
 
 (defun max-len-str() 
   (let (( max -1 ))
     (do ((i 0 (incf i)))
        ((>= i rows) max) 
        (if ( > (length (aref arr i)) max ) 
            (setf max (length (aref arr i)))))))
 
 (defun printf() 
   (do ((i 0 (incf i)) ) 
       ((>= i cols)) 
     (do ((j (- rows 1) (decf j))) 
        ((< j 0)) 
       (if (> (length (aref arr j)) i)  
          (princ (aref (aref arr j) i))
          (princ " ") ))
     (princ #\Newline))) 
 
 (defun rotate-string() 
   (setf rows (read-lines)) 
   (setf cols (max-len-str)) 
   (printf))
 
 (rotate-string)  
題目連結:http://zerojudge.tw/ShowProblem?problemid=c045

2013年9月14日 星期六

c033: Prime Cuts、UVA 406

#include<stdio.h>

int primes[] = {1,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,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997} ;

int main(){
    int N, C ;
    int i ;

    while(scanf("%d %d", &N, &C)==2){
        int count = 0 ;
        for(i=0 ; i<sizeof(primes)/sizeof(int) ; ++i){
            if(primes[i]<=N) count++ ;
            else break ;
        }
        int C_new = (count%2 ? 2*C-1 : 2*C ) ;
        int low, high ;
        if(C_new>count) {
            low = 0, high = count-1 ;
        }
        else{
            if(count%2){
                int mid = count/2 ;
                low = mid-(C-1) ;
                high = mid+(C-1) ;
            }
            else{
                int mid1 = count/2-1 ;
                int mid2 = count/2 ;
                low = mid1-(C-1) ;
                high = mid2+(C-1) ;
            }
        }
        printf("%d %d:", N, C) ;
        for(i=low ; i<=high ; ++i)
            printf(" %d",primes[i]) ;
        printf("\n\n") ;
    }
    return 0 ;
}

2013年9月11日 星期三

c032. 00382 - Perfection、UVA 382

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

int sum_divisor(int n){
    if(n==1) return 0 ;
    else{
        int sum = 1, i ;
        for(i=2 ; i<=sqrt(n) ; ++i){
            if(!(n%i)){
                if(i == n/i) sum += i ;
                else sum += i+n/i ;
            }
        }
        return sum ;
    }
}

int main(){
    int n ;
    int sum ;
    int i ;
    puts("PERFECTION OUTPUT") ;
    while(scanf("%d",&n)==1 && n){
        printf("%5d  ",n) ;
        sum = sum_divisor(n) ;
        if(sum < n) puts("DEFICIENT") ;
        else if(sum > n) puts("ABUNDANT") ;
        else puts("PERFECT") ;
    }
    puts("END OF OUTPUT") ;
    return 0;
}

c031: Count on Cantor、UVA 264

#include<stdio.h>
#include<stdlib.h>
#define swap(a,b){int t; t=a; a=b; b=t;}

int main(){
    int n ;
    int i ;
    while(scanf("%d",&n)==1){
        for(i=1 ; i<4473 ; ++i){
            int low = (i*i-i+2)>>1 ;
            int high = ((i+1)*(i+1)-(i+1)+2)>>1 ;
            if(n>=low && n<high){
                int left=1, right=i ;
                int d=n-low ;
                left += d, right -= d;
                if(i%2) swap(left,right) ;
                printf("TERM %d IS %d/%d\n", n, left, right) ;
            }
        }
    }
    return 0 ;
}

2013年8月25日 星期日

c024: 10079 - Pizza Cutting、UVA 10079

#include<stdio.h>

int main(){
    long long int n ;
    while(scanf("%lld",&n) && n>=0)
        printf("%lld\n",(n*(n+1)>>1)+1) ;
    return 0 ;
}

c022. 10783 - Odd Sum、UVA 10783

#include<stdio.h>
#include<stdlib.h>

int main(){
    int t ;
    int a, b ;
    int sum ;
    int i, j;
    scanf("%d", &t) ;
    for(j=1 ; j<=t ; ++j){
        sum = 0 ;
        scanf("%d %d", &a, &b) ;
        a = a%2?a:a+1 ;
        for(i=a ; i<=b ; i+=2){
            sum += i ;
        }
        printf("Case %d: %d\n", j, sum) ;
    }
    return 0 ;
}

c015. Reverse and Add、UVA 10018

#include<iostream>
#include<string>
#include<sstream>
using namespace std ;

size_t reverseint(size_t num){
    size_t inrev=0 ;
    while(num>0){
        inrev = inrev*10+num%10 ;
        num /= 10 ;
    }
    return inrev ;
}

size_t reva(size_t num){
    return num+reverseint(num) ;
}

int check_pd(unsigned int num){
    stringstream ss ;
    string str ;
    ss << num ;
    ss >> str ;
    for(int i=0 ; i<str.length()>>1 ; ++i)
        if(str[i]!=str[str.length()-i-1])
            return 0 ;
    return 1 ;
}

int main(){
    int t,  counter;
    size_t num ;
    cin >> t ;
    while(t--){
        counter = 0 ;
        cin >> num ;
        do{
            num = reva(num) ;
            counter++ ;
        }while(!check_pd(num)) ;
        cout << counter << " " << num << endl ;
    }
    return 0 ;
}

2013年8月22日 星期四

c014. Primary Arithmetic、UVA 10035

#include<iostream>
#include<string>

using namespace std ;

int main(){
    string num1, num2 ;
    int cb, cs ;
    string fill ;
    while(cin >> num1 >> num2){
        if(num1=="0" && num2=="0") break ;

        if(num1.length() > num2.length()){
            fill.assign(num1.length()-num2.length(),'0') ;
            num2 = fill+num2 ;
        }
        else{
            fill.assign(num2.length()-num1.length(),'0') ;
            num1 = fill+num1 ;
        }

        string::reverse_iterator rit1=num1.rbegin() ;
        string::reverse_iterator rit2=num2.rbegin() ;
        cb = 0, cs = 0;
        for(; rit1!=num1.rend() ; ++rit1, ++rit2){
            if(*rit1-'0'+*rit2-'0'+cb >= 10) cb=1, cs++ ;
            else cb=0;
        }
            if(cs>1)
            cout << cs << " carry operations." << endl ;
        else if(cs==1)
            cout << "1 carry operation." << endl ;
        else
            cout << "No carry operation." << endl ;
    }
    return 0 ;
}

c013. 00488 - Triangle Wave、UVA 488

#include<stdio.h>

int main(){
    int t ;
    int a, f ;
    int plus, counter ;
    int i, j, k;
    scanf("%d",&t) ;
    while(t--){
        scanf("%d %d",&a,&f) ;
        for(k=0 ; k<f ; ++k){
            plus = 1, counter = 1 ;
            for(i=1 ; i<= 2*a-1 ; ++i){
                for(j=0 ; j<counter ; ++j)
                    printf("%d",counter) ;
                puts("") ;

                if(i==a) plus = 0 ;
                (plus) ? counter++ : counter-- ;
            }
            puts("") ;
        }
    }
    return 0 ;
}