1. ACM UVA-11997

    這題是給k個大小為k的array,每個array挑一個數字再總和,求k個最小的總和。

    由於題目總共會有k的k次方種總和,所以用暴力解的話一定會TLE。

    我們可以推出在k列中的任意兩列一定對答案有貢獻,例如任意兩列選兩個數字出來總和也一定是最小,所以我們可以逐列求出答案出來,首先要先將每一列排序,假設前兩列為A跟B,那我們可以先將a1+b1,a2+b1,a3+b1...ak+b1放到min heap裡面,a1+b1一定是最小的,所以先pop出來,這時候我們可以將a1+b2放到heap中,因為如果我們放的是其他組合的話,在heap裡面一定會有數字是更小的(例如我們放a2+b2,但是heap裡面的a2+b1是更小的),而a2+b2 = (a1+b1)+b2-b1,a1+b1是本來pop出來的值,有一個規律是每次變更的都會是b的index,pop k次之後,就可以求出這兩行裡面的k個最小值,照這樣的作法逐行求取k個最小的值。

    //ignore header files
    
    struct element{
        int sum,index ...

    Read more...


  2. ACM UVA-147

    DP,其實跟爬階梯很像,都假設每個幣值是最後一個放進去的,例如題目給10元,十元的組合可以從一個5元加上一個5元算出來,其實就等於加上d[10-5]。假設一開始先測5元的,那麼我們可以算出十元的可以由一個五元加上一個五元組成,下一個階段測10元的,那麼我們又可以算出一個十元可以由一個十元所組成(d[10-10] = d[0],所以d[0]要設成1)。那下次就是從幣值大於十元的開始算,假設幣值是20元,理所當然20元之前的都已經被算完了,因為都小於20元,20元根本放不進去(所以這題也有點類似背包問題)。

    by the way,這程式一開始忘記初始化,結果變得很奇怪XD。

    int main(int argc, char const* argv[])
    {
        int money[] = {10000,5000,2000,1000,500,200,100,50,20,10,5};
        unsigned ...

    Read more...


  3. ACM UVA-160

    prime

    bool is_prime[101];
    int prime[101];
    int ans[101];
    int main(int argc, char const* argv[])
    {
        int m = 0;
        for(int i = 2;i <= 100;i++) {
            if(!is_prime[i]){
                prime[m++] = i;
                for(int j = i*i;j <= 100;j = j+i){
                    is_prime[j] = true;
                }
            }
        }
        int n;
        while(scanf ...

    Read more...


  4. ACM UVA-216

    本來以為這題是MST,但是題目要求的是每個node只能有兩條branch(想成是兩個連接點),也就是用一條線串起全部的node。 這題的input size最多只到8,所以就用暴力解,找出最佳的排列。

    //ignore header files
    struct point{
        int x,y;
        point(int _x,int _y){
            x = _x;
            y = _y;
        }
    };
    #define dis(p1,p2) sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y))
    int main(int argc, char const* argv[])
    {
        int ...

    Read more...


  5. ACM UVA-294

    這題是給定一個範圍的數字,假設是1到100,要找出哪一個數字有最多的除數。

    這題就相當於做質因數分解,假設有個數字N = 2^2 X 3^2 X 7,那它的除數個數就相當於(2+1)*(2+1)(1+1)。

    首先是質數篩,一個合數N必定有小於等於sqrt(N)的質因數,所以我們要先算出小於等於N以下的質數有幾個。

    bool is_prime[31631];
    unsigned long long prime[16000];
    int main(int argc, char const* argv[])
    {
        int m = 0;
        for(int i = 2;i <= 31630;i++){
            if ...

    Read more...


  6. ACM UVA-355

    這題是給定一個n進位的數字,轉換成一個m進位的數字。 我是先轉成十進位,之後轉成m進位。 比較注意的是要用到unsigned long long來存十進位的數字。

    int main(int argc, char const* argv[])
    {
        int m,n;
        char s[20];
        char label[6] = {'A','B','C','D','E','F'};
        while(scanf("%d %d %s",&m,&n,s) != EOF){
            unsigned long long sum = 0;
            //printf("%d\n",sizeof(sum));
            bool find ...

    Read more...


  7. ACM UVA-369

    組合數+dp

    void combi(unsigned long **);
    int main()
    
    {
        unsigned long **table;
        table=new unsigned long*[101];   //0到100 
        for(int i=0;i<101;i++)
        {
        table[i]=new unsigned long [i+2];  //0到i+1 
        table[i][i+1]=0;
        table[i][i]=1;
        table[i][0]=1;
        }
    
    
        combi(table);
    
        int n ...

    Read more...


  8. ACM UVA-374

    recursion

    因為(A*B)%C = ((A%C) * (B%C))%C

    所以 B^P % M = (B^(P/2)(B^(P/2)))%M = (((B^(P/2))%M)((B^(P/2))%M))%M

    unsigned long long ans;
    unsigned long long solution(int b,int p,int m){
        if(p == 1){
            return (b%m ...

    Read more...


  9. ACM UVA-495

    Fibonacci+dp

    char ans[5001][3000];
    using namespace std;
    int main(int argc, char const* argv[])
    {
        ans[0][0] = 0 ;
        ans[1][0] = 1; 
        int k;
        for(int i = 2;i <= 5000;i++){
            for(int j = 0;j<3000;j++){
                //printf("hello\n");
                ans[i][j] += ans[i-1][j ...

    Read more...


  10. ACM UVA-498

    多項式

    int main(int argc, char const* argv[])
    {
        string c,x;
        while(getline(cin,c) && getline(cin,x)){
            vector<int> xx;
            istringstream stream1(x);
            int xn;
            while(stream1>>xn){
                xx.push_back(xn);
            }
            vector<int> cc;
            istringstream stream2(c);
            int cn;
            while(stream2>>cn){
                cc.push_back(cn);
            }
            int lx = xx.size ...

    Read more...


« Page 12 / 13 »