2011年12月9日 星期五

d150: 11369 - Shopaholic

內容 :
    林希是個購物狂。每次只要有買二送一的折扣,她就像瘋了一樣要買下店裡所有的商品。你已經放棄治療她的病了,但是想減少她的支出。
    你知道買二送一所送的一定是結帳商品中最便宜的那幾樣。比如說,你的朋友拿了價值為400, 350, 300, 250, 200, 150, 及 100 的七樣商品到櫃枱去結帳,她就得付 1500 元。她省下了最便宜的兩樣商品的價錢,也就是 250 元。如果她分三次去結帳,她可以省下更多的錢。比如說,她先拿400, 300 和 250 的去結,第一次就可以省下 250 元。第二次她只拿 150 元的去結,沒有折扣。但是第三次她拿350, 200, 和 100 的去結,又省了 100 元,總共省下了 350 元。
    你的工作便是找出林希最多可以省多少錢。

輸入說明 :
    第一行是測試筆數 1 ≤ t ≤ 20。每筆測試有兩行輸入。第一行是林希買的商品數 1 ≤ n ≤ 20000。下一行則是這些商品的價格 1 ≤ pi ≤ 20000。

輸出說明 :
    每個測試,輸出一行,印出如果林希適當地分次結帳時所能省下的最大金額。

範例輸入 :
1
6
400 100 200 350 300 250

範例輸出 :
400

出處 :
    UVa ACM 11369

程式碼 :
#include <stdio.h> 
#include <stdlib.h> 

#define SWAP(x,y) {int t; t = x; x = y; y = t;} 

void quicksort(int[], int, int, int); 

int main(void)
{ 
    int t,n,i,num[20000],ans;
    
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(i=0; i<n; i++)
            scanf("%d",&num[i]);
        quicksort(num, 0, n-1, n);
        
        ans = 0;
        for(i=2; i<n; i=i+3)
            ans+=num[i];
        printf("%d\n",ans);
    }
    return 0; 
}

void quicksort(int number[], int left, int right, int MAX)
{
    int i, j, s;
    if(left < right)
    {
        s = number[left];
        i = left;
        j = right + 1;
        while(1)
        {
            while(i + 1 < MAX && number[++i] > s) ;
         
            while(j -1 > -1 && number[--j] < s) ;
            if(i >= j)
                break;
            SWAP(number[i], number[j]);
        }
        number[left] = number[j];
        number[j] = s;
        quicksort(number, left, j-1, MAX);
        quicksort(number, j+1, right, MAX);
    } 
}


http://zerojudge.tw/ShowProblem?problemid=d150

a291: nAnB problem

內容 :
    我們常用數字密碼鎖來保護重要的東西,但要是不小心忘了密碼麻煩就大了!
    以四位數字的密碼鎖為例,我們最多要嘗試10^4=10000次才能解鎖。這時候要是
    有辦法知道目前嘗試的密碼錯了幾個字,那解鎖的速度就快多了。請寫一個程式,
    可以判斷每組數字跟正確答案差了幾個字。

輸入說明 :
    多筆輸入。
    第一行有四個介於0-9之間的數字,代表正確的密碼
    第二行有一個整數n,1<=n<=10000,代表接下來嘗試n組密碼
    接下來有n行,每行有四個介於0-9之間的數字,每行各代表一組嘗試的密碼。

輸出說明 :
    輸出n行。
    對於每組嘗試的密碼,若有p個數字的值正確,且在正確的位子上,
    另外有q個數字的值正確,但不在正確的位子上,
    輸出pAqB。
    範例見測資。

範例輸入 :
1 2 3 4
4
1 1 4 5
1 2 4 3
1 1 4 4
4 3 2 1

1 1 1 5
4
1 1 1 1
0 9 2 8
1 5 2 3
1 1 5 1

範例輸出 :
1A1B
2A2B
2A0B
0A4B
3A0B
0A0B
1A1B
2A2B

程式碼 :
#include<stdio.h>
int main()
{
    int a,b,i,j,n,ans[4],input[4],check[4];
    while(scanf("%d %d %d %d",&ans[0],&ans[1],&ans[2],&ans[3])==4)
    {
        scanf("%d",&n);
        while(n--)
        {
            a = b = 0;
            for(i=0; i<4; i++)
            {
                scanf("%d",&input[i]);
                if(ans[i] == input[i])
                {
                    a++;
                    check[i] = 1;
                }
                else
                    check[i] = 0;
            }
            for(i=0; i<4; i++)
                if(check[i] != 1)
                    for(j=0; j<4; j++)
                        if(check[j]==0 && (input[i] == ans[j]) && j!=i)
                        {
                            b++;
                            check[j] = 2;
                            break;
                        }
            printf("%dA%dB\n",a,b);
        }
    }
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=a291

2011年12月8日 星期四

d481: 矩陣乘法

內容 :
    矩陣相乘最重要的方法當然是一般矩陣乘積了,它只有在第一個矩陣的列數 (column)和第二個矩陣的行數(row)相同時才有定義。一般單指矩陣乘積時,指的便是 一般矩陣乘積。若 A 為 m×n 矩陣,B 為 n×p 矩陣,則他們的乘積 AB(有時記做A · B)會是 一個 m×p 矩陣。其乘積矩陣的元素如下面式子得出:

 

    以上是用矩陣單元的代數系統來說明這類乘法的抽象性質。

    由定義直接計算

Matrix multiplication diagram.PNG左邊的圖表示出要如何計算 AB 的 (1,2) 和 (3,3) 元素,當 A 是個 4×2 矩陣和 B 是個 2×3 矩陣時。分別來自兩個矩陣的元素都依箭頭方向而兩兩配對,把每一對中的兩個元素相乘,再把這些乘積加總起來,最後得到的值即為箭頭相交位置的值。

    內容來源:矩陣乘法

(AB)_{1,2} = \sum_{r=1}^2 a_{1,r}b_{r,2} = a_{1,1}b_{1,2}+a_{1,2}b_{2,2}
(AB)_{3,3} = \sum_{r=1}^2 a_{3,r}b_{r,3} = a_{3,1}b_{1,3}+a_{3,2}b_{2,3}

    每組測資有 2 個矩陣,請把他們相乘之後的結果輸出

輸入說明 :
    輸入數據不會超過 231-1
    兩矩陣大小不超過 100 * 100
    每組測資第一行四個數字 a b c d
    代表第一個矩陣有 a 列 b 行
            第二個矩陣有 c 列 d 行
    接下來 a 行,每行 b 個數字
                 c 行,每行 d 個數字
    每個數字以空白隔開
    不懂請參考範例輸入

輸出說明 :
    輸出相乘之後的矩陣
    每個數字以空白隔開
    兩矩陣不能相乘請輸出Error再換下一組測資(不用讀取矩陣)

範例輸入 :
3 2 2 3
1 2
3 4
5 6
1 2 3
4 5 6
1 2 3 4

範例輸出 :
9 12 15
19 26 33
29 40 51
Error

程式碼 :
#include<stdio.h>

int main()
{
    int a,b,c,d,i,j,k,temp;
    long long data1[100][100],data2[100][100],ans[100][100];
    
    while(scanf("%d %d %d %d",&a,&b,&c,&d)==4)
    {
        if(b != c)
            printf("Error\n");
        else
        {
            for(i=0; i<a; i++)
                for(j=0; j<b; j++)
                    scanf("%lld",&data1[i][j]);
            for(i=0; i<c; i++)
                for(j=0; j<d; j++)
                    scanf("%lld",&data2[i][j]);
            
            for(i=0; i<a; i++)
                for(j=0; j<d; j++)
                {
                    ans[i][j] = 0;
                    for(k=0; k<b; k++)
                        ans[i][j]+=data1[i][k]*data2[k][j];
                }
            
            for(i=0; i<a; i++)
            {
                for(j=0; j<d; j++)
                    printf("%lld ",ans[i][j]);
                printf("\n");
            }
        }
    }
    
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d481

2011年10月30日 星期日

a263: 日期差幾天

內容 :
    給你兩個日期,問這兩個日期相差幾天。

輸入說明 :
    輸入有多筆測資,每筆測資有兩行,每行有三個整數依序是年、月、日。輸入以 EOF 作為結束,題目保證不會有不符合的測資出現。

輸出說明 :
    輸出兩個日期差幾天。

範例輸入 :
2011 10 19
2011 10 18

範例輸出 :
1

提示 :
    年份在[0,9999]範圍內

程式碼:
#include <stdio.h>

int monthday[13] = {0,0,31,59,90,120,151,181,212,243,273,304,334};

int calculateDay(int year, int month, int day)
{
    int leaps,isleap;
    
    isleap = (year%4==0 && year%100!=0) || year%400==0;
    
    year--;
    leaps = year/4 - year/100 + year/400;
    
    return (year*365+leaps) + (monthday[month]+((month>2)?isleap:0)) + day;
}

int main ()
{
    int i,year[2],month[2],day[2],check;
  
    while(scanf("%d %d %d",&year[0],&month[0],&day[0])==3)
    {
        scanf("%d %d %d",&year[1],&month[1],&day[1]);
        
        check = calculateDay(year[0],month[0],day[0]) - calculateDay(year[1],month[1],day[1]);
        
        printf("%d\n",check>-1?check:-check);
    }
    
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=a263

a008: 中文大寫數字

內容 :
    我們在金融機構填寫金額時使用的不是阿拉伯數字,而是中文的大寫數字。
    請寫一個程式將數字轉換為中文大寫數字
    標準大寫寫法如下:零、壹、貳、參、肆、伍、陸、柒、捌、玖、拾、佰、仟、萬、億

輸入說明 :
    整數數字 >=0 且 <=2147483647

輸出說明 :
    文字字串

範例輸入 :
12345
10200

範例輸出 :
壹萬貳仟參佰肆拾伍
壹萬零貳佰

提示 :
    * 遇到 10 時輸出 『拾』or『壹拾』均可

程式碼 :
#include<stdio.h>
#include<string.h>

void map(char num)
{
    switch(num)
    {
        case '1':
            printf("壹"); break;
        case '2':
            printf("貳"); break;
        case '3':
            printf("參"); break;
        case '4':
            printf("肆"); break;
        case '5':
            printf("伍"); break;
        case '6':
            printf("陸"); break;
        case '7':
            printf("柒"); break;
        case '8':
            printf("捌"); break;
        case '9':
            printf("玖"); break;
        case '0':
            printf("零"); break;
    }
}

int main()
{
    int i,len,zero,check;
    char num[20];
    
    while(scanf("%s",num)==1)
    {        
        for(; num[0] == 48; )
        {
            len = strlen(num);
            for(i=0; i<len; i++)
                num[i] = num[i+1];
        }
        
        len = strlen(num);        
        zero = 0;
                
        check = 0;
        for(i=9; i>-1; i--)
        {
            if(len > i)
            {
                if(num[len-i-1] == '0')
                    zero = 1;
                else
                {
                    if(zero)
                        map('0');
                    zero = 0;
                    map(num[len-i-1]);
                    
                    if(i == 7 || i == 3)
                        printf("仟");
                    if(i == 6 || i == 2)
                        printf("佰");
                    if(i == 9 || i == 5 || i == 1)
                        printf("拾");
                    check = 1;
                }
                if(i == 4 && check)
                {
                    check = 0;
                    printf("萬");
                }
                else if(i == 8 && check)
                {
                    check = 0;
                    printf("億");
                }
            }
        }
        printf("\n");
    }
    return 0;
}



http://zerojudge.tw/ShowProblem?problemid=a008

2011年10月27日 星期四

a276: 又分糖果囉

內容 :
    再分糖果吧!
    你一開始有 n 包糖果,每包糖果裡面有若干顆,想要公平的分給 2 個人
    所謂公平就是指這兩個人有的糖果數量的差越小越好。

輸入說明 :
    多組輸入,以EOF作為結束
    每組測試資料的第一行是一個正整數 n ,第二行有 n 個數字 mi 以空格隔開
    1 <= n <= 20
    1 <= mi <= 1000000

輸出說明 :
    輸出兩人糖果數量的的差。

範例輸入 :
4
1 3 7 8
5
1 2 4 9 4

範例輸出 :
1
0

提示 :
    第一組:(3,7) 和 (1,8)
    第二組:(4,4,2) 和 (1,9)

概念講解 :
    可以試著用01背包問題來解決。
    不懂什麼是01背包問題沒關係,我們只需要知道對這一包糖果我們有兩個選擇,那就是拿和不拿,我們以範例一為例,並假設左邊是不拿,右邊是拿,接著看看下面我辛苦畫的圖吧!


對其中一個人而言,每包糖果都有兩個選擇,那就是拿和不拿
                                                                              start
                                                        不拿 |────────────|拿
                                                                0                                   1                 第一包糖果 有1個糖果
                                                 不拿 |────|拿           不拿 |─────|拿
                                                         0           0+3                  1            1+3      第二包糖果 有3個糖果 
剩下的請允許我偷懶一下          |───|      |───|            |───|       |───|
拿與不拿就省略不寫                 0        7     3     10          1       8     4       11   第三包糖果 有7個糖果 
                                                  |─|     |─|    |─|    |─|        |─|     |─|    |─|     |─|
                                                 0  8   7 15 3 11 10 18    1  9   8 16 4 12  11 19 第四包糖果 有8個糖果


    看到最下面的16個數字了嗎?這些就是所有糖果的組合情況,也就是代表說這些是兩個人中的其中一個人拿到的所有情形,既然算出了其中一個人的糖果數,那另一個人的糖果數相信你一定可以算得出來,最後把糖果數差最小的印出來就行了。

程式碼 :
#include<stdio.h>
#include<stdlib.h>

int min,n,total,mi[20];

void isGet(int temp, int index)
{
    if(index == n)
    {
        temp = total - temp - temp;
        if(temp < 0)
            temp = -temp;
        if(temp < min)
            min = temp;
        return ;
    }
    if(min == 0)
        return ;
    isGet(temp, index+1);
    isGet(temp + mi[index], index+1);
}

int main()
{
    int i;
    
    while(scanf("%d",&n)==1)
    {
        total = 0;
        min = 99999999;
        for(i=0; i<n; i++)
        {
            scanf("%d",&mi[i]);
            total += mi[i];
        }
        isGet(0, 0);
        printf("%d\n",min);
    }
    
    return 0;
}





http://zerojudge.tw/ShowProblem?problemid=a276

2011年10月7日 星期五

zerojudge 進不去題目

今天寫題目寫到一半,要進去重新看題目時,發現進不去,並跳出許多錯誤訊息,如下:

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

糟糕囉!網頁發生錯誤500
請通知管理員!謝謝!jiangsir@zerojudge.tw
javax.el.PropertyNotFoundException: Property 'accessible_Testjudge' not found on type idv.jiangsir.Beans.ProblemBean
Request that failed: /ShowProblem
Status code: 500
Exception: javax.el.PropertyNotFoundException: Property 'accessible_Testjudge' not found on type idv.jiangsir.Beans.ProblemBean

顯示例外堆疊追蹤:
javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:214)
javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.java:191)
javax.el.BeanELResolver.property(BeanELResolver.java:300)
javax.el.BeanELResolver.getValue(BeanELResolver.java:81)
javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
org.apache.el.parser.AstValue.getValue(AstValue.java:123)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:938)
org.apache.jsp.ShowProblem_jsp._jspx_meth_c_005fif_005f12(ShowProblem_jsp.java:2060)
org.apache.jsp.ShowProblem_jsp._jspService(ShowProblem_jsp.java:542)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:386)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
idv.jiangsir.zerojudge.controller.ShowProblemServlet.doGet(ShowProblemServlet.java:189)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
idv.jiangsir.utils.filter.PreviousFilter.doFilter(PreviousFilter.java:90)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
idv.jiangsir.utils.filter.GeneralFilter.doFilter(GeneralFilter.java:155)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
org.apache.catalina.valves.RequestFilterValve.process(RequestFilterValve.java:276)
org.apache.catalina.valves.RemoteAddrValve.invoke(RemoteAddrValve.java:81)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
java.lang.Thread.run(Thread.java:619)
------------------------------------------------------------------------------------------------------------

*可惜沒摸過,看不懂,但重點不是這個,是要怎麼看到題目?
利用google 搜尋  "zerojudge 題號 "  , ex: "zerojudge a001"
然後點庫存頁面,就可以看到以前的記錄了

*再來就是重點的,要怎麼把我寫好的code去judge呢?
只要輸入下面那一行就可以直接Judge了

http://zerojudge.tw/SubmitCode?problemid=題號

ex: http://zerojudge.tw/SubmitCode?problemid=a001

其實他的網站只有讀題目內容有錯誤,其他的部分還是正常的
希望可以幫助有遇到相同問題的人,最好是快點修好比較重要啦,畢竟我的方法是治標不治本。




2011年9月28日 星期三

d594: G. 總共需要多少錢

內容 :
    小甜和小甘是一對感情很要好的雙胞胎,她們的喜好相似,而且總是形影不離。一起到學校上課、討論功課和寫作業,外出用餐的時候總是點相同的食物,而且買東西的時候同一種東西一定會買兩份一模一樣的!

    每個星期三放學以後到去上補習班的空檔,小甜和小甘會一起去買一些點心和飲料來吃。因為她們還要趕著去上補習班,所以總是沒有太多時間挑選點心和飲料。

    由於小甜和小甘的喜好和行為模式實在是太相似了,兩個人每次都會考慮很久,然後選了相同的東西,於是她們決定一個人負責挑選一種點心、另一個人負責挑選一種飲料,這樣就可以省下很多時間了。

    小甜和小甘兩個人還有一個很大的毛病,就是她們每次都會懷疑店員算錯錢,偏偏兩個人的算數都不是很好。你能幫幫她們寫一個程式,用來計算每次買的點心和飲料總共需要多少錢嗎?

輸入說明 :
    第一行有一個整數 N,代表總共有幾本測試資料,至多 100 筆。
    接下來有 N 行,每一行代表一筆測試資料。
    每一筆測試資料有兩個整數 a 和 b(1 ≦ a, b ≦ 200 )
    代表這次小甜選的點心單價為 a、小甘選的飲料單價為 b。

輸出說明 :
    針對每一筆測試資料,輸出小甜和小甘這次買的點心和飲料總共需要多少錢。

範例輸入 :
3
75 125
49 35
50 30

範例輸出 :
400
168
160

程式碼 :
#include <stdio.h>

int main()
{
    int i,n,a,b;
    
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d%d",&a,&b);
        printf("%d\n",(a+b)<<1);
    }
    return 0;
}





http://zerojudge.tw/ShowProblem?problemid=d594

d590: C. 一定中大樂透

內容 :
    政府最近開始推行『一定中大樂透』,規則如下:
    自己在心中選擇一個數字 N ( 0 < N ≤ 100 ),並且寫在紙條上
    機器自動選擇一個數字 M ( 0 < M ≤ 100 )
    如果紙條上的數字和機器選擇的數字同為「奇數」或是同為「偶數」,則玩家勝,否則玩家失敗。
    現在給你玩家選擇的數字 N 和機器選擇的數字 M,請判斷玩家是否勝利。

輸入說明 :
    輸入檔含有多組資料,每組資料一行。
    一組資料包含兩個數字 N, M ( 0 < N ≤ 100, 0 < M ≤ 100 ) 以空白字元分開。
    當 N = 0 且 M = 0 時代表輸入結束,這組資料不需要被處理。

輸出說明 :
    對每組測試資料輸出一行,如果玩家勝,則輸出「Win」,否則輸出「Loss」。

範例輸入 :
1 2
3 3
100 2
0 0

範例輸出 :
Loss
Win
Win

程式碼 :
#include <stdio.h>
int main() 
{
    int a,b;
    
    while(scanf("%d%d",&a,&b)==2)
    {
        if(a == b && a == 0)
            break;
        if((a%2)==(b%2))
            printf("Win\n");
        else
            printf("Loss\n");
        
    }
    
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d590

d587: 參貳壹真好吃

內容 :
    參貳壹真是太好吃了!
    現在有一連串由1、2、3這三個數字組成的數列,
    請你把他們由小到大排好好嗎?

輸入說明 :
    本題有2個測資點,每個50分,每個測資點只有一組測資。
    第一行有整數n(1<=n<=1000000)代表接下來的數列有幾個數字
    第二行就是這n個包含1、2、3的數字

輸出說明 :
    對於每組測資,請輸出一行由小到大1~3排好的結果。

範例輸入 :
9
1 1 1 2 2 3 3 3 2

範例輸出 :
1 1 1 2 2 2 3 3 3

提示 :
    背景知識: 陣列
    對於兩個測資點…
    第一個測資點(50%)的n是3的倍數,並且1、2、3這三種元素的數量均等
    第二個測資點(50%)正常

程式碼 :
#include <stdio.h>

int main() 
{
    int i,j,n,num,arr[4];
    
    while(scanf("%d",&n)==1)
    {
        for(i=1;i<4;i++)
            arr[i] = 0;
        
        for(i=0;i<n;i++)
        {
            scanf("%d",&num);
            arr[num]++;
        }
        
        for(i=1;i<4;i++)
        {
            num = arr[i];
            for(j=0;j<arr[i];j++)
                printf("%d ",i);
        }
        printf("\n");
    }  
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d587

2011年9月25日 星期日

a244: 新手訓練 ~ for + if

內容 :
    內容就是~~~~
    希望學到for迴圈和剛開始coding的學弟好好加油!!!!

輸入說明 :
    第一行有一個正整数N,
    代表接下來有N行每行有三個正整數 a , b , c
    ( 1 <= b , c <= 2147483647 )
    ( 1 <= a <= 4 )

輸出說明 :
    如果 a = 1 請輸出 b+c
    如果 a = 2 請輸出 b-c
    如果 a = 3 請輸出 b*c
    如果 a = 4 請輸出 b/c
    結果請用整数輸出

範例輸入 :
4
1 2 3
2 2 3
3 2 3
4 2 3

範例輸出 :
5
-1
6
0

程式碼 :
#include<stdio.h>

int main()
{
    long long int i,n,a,b,c;
    
    scanf("%lld",&n);
    for(i=0; i<n; i++)
    {
        scanf("%lld %lld %lld",&a,&b,&c);
        if(a == 1)
            printf("%lld\n",b+c);
        else if(a == 2)
            printf("%lld\n",b-c);
        else if(a == 3)
            printf("%lld\n",b*c);
        else
            printf("%lld\n",b/c);
    }
    return 0;
}


http://zerojudge.tw/ShowProblem?problemid=a244

a241: 第二題:1 / x 是有限小數

內容 :
    請你寫一個程式,輸入正整數 n 求 1 < x ≤ n﹐滿足 1 / x 是有限小數的 x 值共有多少個?

輸入說明 :
    有m(1≤m≤6)組測試資料且1≤n≤100000000,每組測試資料均為一行
    接下來共有m行,每行有1個整數。

輸出說明 :
    對於每一組測試資料,輸出一行一個數字,代表著這個個數。

範例輸入 :
2
3
5

範例輸出 :
1
3

提示 :
    如果有包含2和5以外的因數,就是無限小數

程式碼 :
#include<stdio.h>

int main()
{
    int i,j,m,n,two,five,two_p,five_p,record_p,total;
    int record[500001];
    
    total = 0;
    record[0] = 1;
    record_p = 1;
    two_p = 0;
    five_p = 0;
    two = record[two_p] * 2;
    five = record[five_p] * 5;
    while(two <= 100000000 || five <= 100000000)
    {
        if(two == five)
        {
            record[record_p] = two;
            record_p++;
            if(two < 100000000)
            {
                two_p++;
                two = record[two_p] * 2;
            }
            else
                two = 100000001;
            if(five < 100000000)
            {
                five_p++;
                five = record[five_p] * 5;
            }
            else
                five = 100000001;
        }
        else if(two < five)
        {
            record[record_p] = two;
            record_p++;
            if(two < 100000000)
            {
                two_p++;
                two = record[two_p] * 2;
            }
            else
                two = 100000001;
        }
        else
        {
            record[record_p] = five;
            record_p++;
            if(five < 100000000)
            {
                five_p++;
                five = record[five_p] * 5;
            }
            else
                five = 100000001;
        }
        total++;
    }
    record[record_p] = 100000001;
    total++;
            
    scanf("%d",&m);
    for(i=0; i<m; i++)
    {
        scanf("%d",&n);
        for(j=1; j<total; j++)
            if(n < record[j])
                break;
        printf("%d\n",j-1);        
    }
    return 0;
}



http://zerojudge.tw/ShowProblem?problemid=a241

a240: 第一題:1 / 17 小數第 n 位

內容 :
    請寫一個程式,輸入正整數n求若將 1 / 17 化為小數﹐則小數點後第n位數字為多少?及小數點後第1位至第n位的數字和為多少?

輸入說明 :
    有m(1≤m≤5)組測試資料且1≤n≤170000,每組測試資料均為一行
接下來共有m行,每行有1個整數。

輸出說明 :
    對於每一組測試資料,輸出一行2個數字(空格隔開),代表著這個第n位數字及小數點後第1位至第n位的其數字和。

範例輸入 :
2
3
5

範例輸出 :
8 13
2 23

出處 :
板橋高中2011能力競賽

程式碼:
#include<stdio.h>

int main()
{
    int i,m,n,dividend;
    int arr[170001]={0};
    
    dividend = 1;
    for(i=1; i<170001; i++)
    {
        dividend *= 10;
        arr[i] = arr[i-1] + dividend/17;
        dividend %= 17;
    }    
    
    scanf("%d",&m);
    for(i=0; i<m; i++)
    {
        scanf("%d",&n);
        printf("%d %d\n",arr[n]-arr[n-1],arr[n]);
    }
    return 0;
}



http://zerojudge.tw/ShowProblem?problemid=a240




2011年9月18日 星期日

幫VMware減肥和刪除沒用的檔案

    VMware用越久,佔的空間就越大,今天查看了一下,裡面的硬碟所佔空間(C槽)只有6G,結果外面的空間(.vmdk)卻達到10幾G,差這麼多空間,有辦法可以刪除嗎? 當然有啦! 還有其它是VMware用到的暫存資料,我們也可以刪除的呢?

VMware版本
VMware Workstation
7.1.4 build-385536
有安裝VMware tools

1.幫你的VMware硬碟減肥

  • 方法1 (修改自此篇文章) PS:如果懶得看的人,可以看紅字就行了
    • 步驟1 : 打開VMware,並開啟你要壓縮的作業系統
    • 步驟2 : 先確定你的VMware的要壓縮的作業系統有裝VMware Tools(如果沒裝,在windows下可以用選單選VM→Install VMWare Tools , 在Linux不確定這樣可不可以)。
    • 步驟3 : 將虛擬系統裡的垃圾文件清理乾淨(如:附屬應用程式->系統工具->清理磁碟 或者 解安裝用不到的軟體 等方法),然後關機
    • 步驟4 : 選擇你的虛擬機器選項下的"Edit virtual machine settings",在跳出視窗的"Hardware",選擇要處理的硬碟(Hard Disk),再點右邊的"Defragment"進行碎片整理。
                    PS: 在做這個步驟的時候,請一定要保留足夠的空間!!!
















                

                    
    • 步驟5 : 碎片整理完成後啟動虛擬作業系統
    • 步驟6 : 進入系統後點右下角的VMWare Tools圖標會彈出對話框。
    • 步驟7 : 選點「shrink」,選擇你要整理的槽,在按"prepare to shrink",就會開始馬上整理。
    • 步驟8 : 開始處理時,中間跳出視窗也選確定,直到它說完成,你就減肥成功了。

  • 方法2 (轉自此文章) PS:如果懶得看的人,可以看紅字就行了
    • 步驟1 : 首先你需要在真正的電腦找到vmware-vdiskmanager.exe,他會出現在你安裝VMware程式的目錄下,假設我把VMware裝在 C:\Program Files\VMware\VMware Workstation ,你可以在這個目錄下找到,並記起這個路徑。
    • 步驟2 : 在你真正的電腦,按 開始 -> 執行 -> cmd(命令提示字元)。
    • 步驟3 : 我們要先到虛擬機器(.vmdk)的目錄,所以先在cmd輸入"cd /d 虛擬機器的目錄" , 以下是我虛擬機器(.vmdk)的位址
    • cd /d D:\Virtual Machines\Windows XP Professional
      
    • 步驟4 : 再輸入"vmware-vdiskmanager.exe位址" -k "虛擬機器名稱.vmdk"
    • "C:\Program Files\VMware\VMware Workstation\vmware-vdiskmanager.exe" -k "Windows XP Professional.vmdk"
    • 這樣就會開始壓縮了

2.刪除VMware的暫存檔

  • 虛擬機器(xp)裡面的"C:\Documents and Settings\Administrator\Local Settings\Temp\VMwareDnD"裡面的資料都可以刪除,它是當你有資料從真實作業系統到虛擬作業系統複製過程中的暫存檔,所以刪除不會有問題。
  • 在我的真實電腦(Win7)裡面的"C:\Users\Administrator\AppData\Local\Temp\VMwareDnD"裡面的資料都可以刪除,它是當你有資料從虛擬作業系統到真實作業系統複製過程中的暫存檔,所以刪除也不會有問題。

PS:如果有其他地方也可以刪除的也請告訴我一下阿,謝謝!

















2011年9月9日 星期五

a170: 天才的小明

內容 :
    小明剛上高中
    加入了WISH(花蓮高中資研社)
    剛學完進制
    正意氣風發
    沒想到老師突然出了一題加法
    這可不是一般的加法唷~~
    而是進制加法
    我們都知道
    8 + 8 = 16
    所以八進制加八進制就該以十六進制來表達啦~~
    於是老師出了N題八進制加八進制的題目
    請小明輸出十六進制的答案

輸入說明 :
    第一行 輸入一數N,代表有N題
    第2~N+1行 每行輸入兩數A,B(八進制表示)

輸出說明 :
    輸出 A+B 的結果,以十六進制大寫表示

範例輸入 :
3
7 7
77 7
77 77

範例輸出 :
E
46
7E

提示 :
    A、B以及A+B的范围均在long int内。

程式碼 :
#include<stdio.h>

int main()
{
    int n;
    long long a,b;
    
    scanf("%d",&n);
    while(scanf("%o %o",&a,&b)==2)
        printf("%X\n",a+b);
    
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=a170

2011年9月5日 星期一

py2exe error: MSVCP90.dll: No such file or directory

    今天想把我的python轉成exe檔來執行,遇到了error

    error: MSVCP90.dll: No such file or directory

    我的環境有用到wxpython,但是不管怎麼說就是有問題!

    ↓這篇文章有教我們怎麼做

    簡單來說
    Step 1. 下載MSVCP90.dll
    Step 2. 貼到 C:\Python27\DLLs
    完成!!! 開始繼續執行py2exe

    後來看到官網居然有寫到以上的問題,原來是我沒有仔細看他的需求。
    想知道的人可以到右邊的連結觀看: 5.2. Python 2.6, 2.7, 3.0, 3.1




2011年8月30日 星期二

d269: 11579 - Triangle Trouble

內容 :
    有一個三角形工廠有一個很大的問題。給你一些邊的邊長,
    想辦法找出用這些邊長圍出最大的三角形。
    你必須寫一個程式來幫助他們尋找這個三角形。

輸入說明 :
    一開始有一個數字代標有幾個測資,每一個測資的開頭 有一個正整數N(3 ≤ N ≤ 10,000),接下來的N個實數Si代表可以使用的三角形長度 (0 < si ≤ 100,000),一組測試資料可能被分成好幾行。

輸出說明 :
    對於每個測試資料,印出最大三角形的面積(四捨五入到小數點第二位)。如果找不到請印出0.00

範例輸入 :
2
4 3.0 4.0 5.0 100.0
3 1.0 2.0 4.0

範例輸出 :
6.00
0.00

出處 :
    UVA11579 or ACM11579 (管理:nanj0178)

程式碼 :
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int compare(const void *arg1, const void *arg2)
{
    if(*(double *)arg2 < *(double *)arg1)
        return -1;
    else if(*(double *)arg2 == *(double *)arg1)
        return 0;
    else
        return 1;
}

int main()
{
    int i,n,line;
    double s,temp,max,arr[10000];
    
    scanf("%d",&line);
    while(line--)
    {
        max = 0;
        scanf("%d",&n);
        for(i=0; i<n; i++)
            scanf("%lf",&arr[i]);
        
        qsort((void *)arr, n, sizeof(double), compare);
    
        for(i=0; i<(n-2); i++)
        {
            if(arr[i] >= arr[i+1]+arr[i+2])
                continue;
            s = (double)(arr[i]+arr[i+1]+arr[i+2])/2;
            if((temp=sqrt(s*(s-arr[i])*(s-arr[i+1])*(s-arr[i+2]))) > max)
                max = temp;
        }
        printf("%.2lf\n",max);
    }
    system("pause");
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d269

d533: 複數比大小

內容 :
    某日中午,高中一年級的小明,正在與數學考卷奮戰。
    不久後,打鐘了,大家陸陸續續交上考卷。
    隔日,數學考卷發了下來,小明拿到悲慘的32分,其他同學也好不到哪裡去
    「唉唷好難喔!複數好難,比大小好難」
    這種聲音此起彼落,不絕於耳。
    這次的考卷上面出了很多複數比大小的題目
    例如3+2i與5+3i哪一個大?聰明的你一定知道答案是:不能比較
    因為複數通常是不能夠比較的
    我們沒有辦法在複數平面上完整地定義大小關係
    原因是某些情況下例如乘法、加法的性質會被破壞掉
    而這種類似的題目出了許多題
    靈機一動的小明看同學那麼辛苦,於是就想到要找會寫程式的你來幫助他們
    而要做的事就是比較a+bi與c+di的大小
    你可以選擇輸出"Go Die!"(不含引號)拿到一個WA
    或是輸出正確答案得到一個AC,還有小明的心(誤)

輸入說明 :
    第一行會有一個整數n,代表一共有幾對複數要比較大小,0<n<=10000
    接下來的n行,每行會有四個數字,分別是a,b,c,d。
    a,b,c,d皆屬於實數,且-100<=a,b,c,d<100000
    代表了兩個要比大小的複數 a+bi 與 c+di

輸出說明 :
    對於每一組要比的資料,
    如果a+bi>c+di,輸出">"(不含引號)
    如果a+bi=c+di,輸出"="(不含引號)
    如果a+bi<c+di,輸出"<"(不含引號)
    如果不能比較的話,輸出"No"(不含引號)

範例輸入 :
5
1 2 3 4
5 6 7 8
-1 -2 -3 -4
1 2 1 1
2 3 4 5

範例輸出 :
No
No
No
No
No

提示 :
    這題不難 就測資很白爛而已
    注意a,b,c,d的範圍唷~
    ps.這題跟大數完全無關

程式碼 :
#include<stdio.h>

int main()
{
    double a,b,c,d;
    
    scanf("%lf",&a);
    while(scanf("%lf %lf %lf %lf",&a,&b,&c,&d)==4)
    {
        if(b == 0 && d == 0)
        {
            if(a > c)
                printf(">\n");
            else if(a == c)
                printf("=\n");
            else
                printf("<\n");
        }
        else
            printf("No\n");
    }
    return 0;
}



http://zerojudge.tw/ShowProblem?problemid=d533

2011年8月20日 星期六

d092: 算式也可以比大小!?

內容 :
    一日,老師教到了數字的比大小,此時,某K想到了一種新的比較方式,如下:
    a+b=c
    但若a>b時,答案就變成[>c],
    若a=b時,答案就變成[=c],
    若a<b時,答案就變成[<c]。
    而[ >c ] > [ =c ] > [ <c ]


    例如:
    1+1=[=2]
    2+0=[>2]
    0+2=[<2] 


輸入說明 : 

    首先會先輸入要比較的n組算式(n<=1000),之後再輸入兩個正整數a和b,數字最大不會超過2^31-1。若n等於0即跳出。

輸出說明 :

    將a+b加起來後排序(大->小),並輸出。

範例輸入 :
5
1 5
5 1
3 3
4 5
5 6
0

範例輸出 :
<11 <9 >6 =6 <6

提示 :
延長數線。

程式碼 :
#include<stdio.h>

int main()
{
    int a,b,c[1000][2],i,j,k,n,temp;

    while(scanf("%d",&n)==1)
    {
        if(n == 0)
            break;
        
        for(i=0; i<n; i++)
        {
            scanf("%d %d",&a,&b);

            if(a > b)
                c[i][0] = 3;
            else if(a == b)
                c[i][0] = 2;
            else
                c[i][0] = 1;
            c[i][1] = a + b;
        }
        for(i=0; i<n; i++)
            for(j=i+1; j<n; j++)
                if((c[i][1] < c[j][1]) || ((c[i][1]==c[j][1]) && (c[i][0]<c[j][0])))
                    for(k=0; k<2; k++)
                    {
                        temp = c[i][k];
                        c[i][k] = c[j][k];
                        c[j][k] = temp;

                    }
        for(i=0; i<n; i++)
            printf("%c%d ",c[i][0]==1?'<':c[i][0]==2?'=':'>',c[i][1]);
        printf("\n");
    }
    return 0;
}


http://zerojudge.tw/ShowProblem?problemid=d092

a218: 連猴子都會的小case

內容 :
    數數跟排序大概是我們從兩三歲起就開始訓練的技能,現在該是你好好發揮這個技能的時候了!

輸入說明 :
    輸入含多組測資。
    每組測資的第一行含一個整數n,1<=n<=1000,接下來有n個範圍為0-9的整數a1,a2,...,an。

輸出說明 : 把輸入的數字按照出現次數由多到少排序,若次數相同,優先輸出數值較小的數字。 參考範例輸出。

範例輸入 :
5
1 4 5 1 4
10
0 0 0 0 9 9 9 2 2 8

範例輸出 :
1 4 5
0 9 2 8

程式碼 :
#include<stdio.h>

int main()
{
    int i,j,k,n,temp,num[11][2];

    while(scanf("%d",&n)==1)
    {
        for(i=0; i<11; i++)
        {
            num[i][0] = -1;
            num[i][1] = 0;
        }

        for(i=0; i<n; i++)
        {
            scanf("%d",&temp);
            for(j=0; ; j++)
            {
                if(num[j][0] == -1)
                {
                    num[j][0] = temp;
                    num[j][1] = 1;
                    break;
                }
                else if(num[j][0] == temp)
                {
                    num[j][1]++;
                    break;
                }
            }
        }
        for(i=0; num[i][0]!=-1; i++)
            for(j=i+1; num[j][0]!=-1; j++)
                if((num[i][1] < num[j][1]) || ((num[i][1]==num[j][1]) && (num[i][0]>num[j][0])))
                {
                    for(k=0; k<2; k++)
                    {
                        temp = num[i][k];
                        num[i][k] = num[j][k];
                        num[j][k] = temp;
                    }
                }
        for(i=0; num[i][0]!=-1; i++)
            printf("%d ",num[i][0]);
        printf("\n");
    }
    return 0;

}



http://zerojudge.tw/ShowProblem?problemid=a218

2011年8月19日 星期五

d561: 被秒殺的四捨五入

內容 :
    拿氣溫來說,攝氏15度和攝氏15.05度的差距對人來說差異實在不大,有了數學概數的觀念,我們可以透過四捨五入法來得到一個數字的估計值,進而方便統計。
    現在請你將一些小數利用程式來四捨五入。

輸入說明 :
    共計三個測資點,每個測資檔中有多行小數n(-1<=n<=1),至多小數點以下有100位數

輸出說明 :
    請輸出四捨五入至小數點以下第二位的結果

範例輸入 :
1.00000
0.5
0.715
0.1234567890
-0.995

範例輸出 :
1.00
0.50
0.72
0.12
-1.00

提示 :
    背景知識: 浮點數

程式碼 :
#include <stdio.h>

int main()
{
    int i,dot;
    char s[105];
        
    while(scanf("%s",s)==1)
    {
        for(i=0;s[i]!='.';i++);
        dot = i;
        if(s[dot+3]>'4')
            s[dot+2]++;
        for(i=dot+2;i>-1;i--)
        {
            if(s[i]!='.' && s[i]!='-')
            {
                if(s[i]==58)
                {
                    s[i] = 48;
                    if(s[i-1] != '.')
                        s[i-1]++;
                    else
                        s[i-2]++;
                }
                else
                    break;
            }            
        }
        s[dot+3] = '\0';
        if(s[1]==s[3] && s[3]==s[4] && s[4]=='0')
            printf("%s\n",s+1);
        else
          printf("%s\n",s);
    }
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d561

d559: 班號

內容 :
    在北市師大附中,每個班都有一個屬於自己的班號,例如188班、1100班…
    而利用C語言的printf函式便能將整數變數輸出到螢幕上,
    現在請你實作這個基本輸出。

輸入說明 :
    測資中有多行整數n(1<=n<=1261)

輸出說明 :
    請對應每個n輸出一行:
    'C' can use printf("%d",n); to show integer like XXXX
    (請參考範例輸出)

範例輸入 :
1252
1000

範例輸出 :
'C' can use printf("%d",n); to show integer like 1252
'C' can use printf("%d",n); to show integer like 1000

提示 :
    背景知識: 字串處理

程式碼 :
#include <stdio.h>

int main()
{
    int i;
    
    while(scanf("%d",&i)==1)
        printf("'C' can use printf(\"%%d\",n); to show integer like %d\n",i);
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d559

d511: 小明的作業

內容 :
    小明這學期的數學課教到了三角形,於是老師給了他們一個作業,這個星期一到星期五每個人上學時都要帶三根樹枝到學校來,如果那三根樹枝可以構成一個三角形,那天就可以加一分。給你小明所帶樹枝的長度,請你幫他看看他可以加幾分?

輸入說明 :
    輸入一共有 5 行,每行有 3 個整數,代表當天小明所帶的樹枝的長度。

輸出說明 :
    輸出一個整數,代表小明可以加幾分。

範例輸入 :
1 2 3
2 4 6
3 4 5
5 3 2
1 3 5

範例輸出 :
1

程式碼 :
#include <stdio.h>

int main()
{
    int i,total=0,arr[3];
    
    while(scanf("%d%d%d",&arr[0],&arr[1],&arr[2])==3)
    {
        for(i=0;i<2;i++)
            if(arr[i]>arr[2])
                arr[i]^=arr[2]^=arr[i]^=arr[2];
        if(arr[0]+arr[1] > arr[2])
            total++;
    }
    printf("%d\n",total);
    return 0;
}



http://zerojudge.tw/ShowProblem?problemid=d511

d507: 三角形的判斷

內容 :
    給你一個三角形的邊長,請你判斷它是銳角 (acute)、直角 (right)、或是鈍角 (obtuse) 三角形。

輸入說明 :
    輸入只有一行,含有三個由空白隔開的正整數 a, b, c (0 < a, b, c ≤ 46340),代表三角形的邊長。

輸出說明 :
    依三角形的類別輸出「acute triangle」、「right triangle」、或「obtuse triangle」。

範例輸入 :
3 4 5

範例輸出 :
right triangle

程式碼 :
#include <stdio.h>
int main() 
{
    int a,b,c;
    
    while(scanf("%d%d%d",&a,&b,&c)==3)
    {
        if(a > c)
            a^=c^=a^=c;
        if(b > c)
            b^=c^=b^=c;
        a = a * a;
        b = b * b;
        c = c * c;
        if((a+b) == c)
            printf("right triangle\n");
        else if((a+b) < c)
            printf("obtuse triangle\n");
        else
            printf("acute triangle\n");        
    }
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d507

d498: 我不說髒話

內容 :
    文文小學時因交友不慎,學會了說髒話。有一天他說髒話時被老師聽到了,結果被罰在黑板上寫 n 遍「I don't say swear words!」

輸入說明 :
    輸入只有一行,其中含有一個正整數 n,代表文文被罰寫的次數。

輸出說明 :
    輸出 n 行「I don't say swear words!」

範例輸入 :
2

範例輸出 :
I don't say swear words!
I don't say swear words!

程式碼 :
#include <stdio.h>
int main() 
{
    int n,i;
    
    while(scanf("%d",&n)==1)
        for(i=0;i<n;i++)
            printf("I don't say swear words!\n");
    
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d498

d491: 我也愛偶數 (swap 版)

內容 :
    文文愛偶數,無獨有「偶」地,珊珊也愛偶數。珊珊除了收藏偶數以外,每次她收到一些數字時,她還會把其中的偶數挑出來把玩並予以加總。今天珊珊又收到了一個範圍的連續整數,請問這次她從這段數字中所收集到的偶數的總和是多少?

輸入說明 :
    輸入只有一行,其中含有兩個由空白隔開的整數 a, b (0 ≤ a, b ≤ 2147483647)。(a 不一定會小於等於 b 哦!)

輸出說明 :
    請輸出一個整數,代表 a 與 b 之間 (含 a 與 b) 所有偶數的和,(答案會 ≤ 2147483647)。

範例輸入 :
5 2

範例輸出 :
6

程式碼 :
#include <stdio.h>
int main() 
{
    long long a,b;
    
    while(scanf("%lld%lld",&a,&b)==2)
    {
        if(a > b)
            a^=b^=a^=b;
        if(a%2==1)
            a++;
        if(b%2==1)
            b--;
        printf("%lld\n",(a+b)*(b-a+2)>>2);
    }
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d491

d490: 我也愛偶數

內容 :
    文文愛偶數,無獨有「偶」地,珊珊也愛偶數。珊珊除了收藏偶數以外,每次她收到一些數字時,她還會把其中的偶數挑出來把玩並予以加總。今天珊珊又收到了一個範圍的連續整數,請問這次她從這段數字中所收集到的偶數的總和是多少?

輸入說明 :
    輸入只有一行,其中含有兩個由空白隔開的整數 a, b (0 ≤ a ≤ b ≤ 2147483647)。

輸出說明 :
    請輸出一個整數,代表 a 與 b 之間 (含 a 與 b) 所有偶數的和,(答案會 ≤ 2147483647)。

範例輸入 :
2 5

範例輸出 :
6

程式碼 :
#include <stdio.h>
int main() 
{
    long long a,b;
    
    while(scanf("%lld%lld",&a,&b)==2)
    {
        if(a%2==1)
            a++;
        if(b%2==1)
            b--;
        printf("%lld\n",(a+b)*(b-a+2)>>2);
    }    
    return 0;
}



http://zerojudge.tw/ShowProblem?problemid=d490

d489: 伏林的三角地

內容 :
    斜角巷是一個已開發的老社區,其中的空地取得非常地困難。但是隨著社會的進步,人們想要蓋的房子越來越大,但是越大的土地就越難取得,因此,越大的土地價格也越高。事實上,在斜角巷的土地價格便是以土地面積的平方來計算的。伏林在斜角巷有一塊三角形的土地,給你那塊土地的邊長,她想請你幫她算算那塊土地價值多少錢?

輸入說明 :
    輸入只有一行,含有三個以空白隔開的正整數,代表伏林的三角形土地的三邊長。

輸出說明 :
    請輸出一個整數,代表伏林的土地的價值。其價值會是一個介於 1 和 2147483647 之間的整數。

範例輸入 :
3 4 5

範例輸出 :
36

程式碼 :
#include <stdio.h>

int main()
{
    int a,b,c,s;
    
    while(scanf("%d%d%d",&a,&b,&c)==3)
    {
        s = (a + b + c)>>1;
        printf("%d\n",s*(s-a)*(s-b)*(s-c));
    }
    return 0;
}



http://zerojudge.tw/ShowProblem?problemid=d489

d485: 我愛偶數

內容 :
    文文很喜歡偶數,他甚至有收集偶數的習慣。你給他一個範圍的連續整數,他就會把其中的偶數留下來收藏。如今他又拿到了一個範圍的整數,請問他這次收藏了幾個偶數?對文文來說,0 也算是一個偶數哦!

輸入說明 :
    輸入只有一行,其中含有兩個由空白隔開的整數 a, b (0 ≤ a ≤ b ≤ 2147483647)。

輸出說明 :
    輸出一個整數,代表 a 與 b 之間 (含 a 與 b) 一共有多少個偶數。

範例輸入 :
1 4

範例輸出 :
2

提示 :
    你可以只用算術運算子,而不用 if 指令來完成這題嗎?

程式碼 :
#include <stdio.h>

int main()
{
    int a,b;
    
    while(scanf("%d%d",&a,&b)==2)
        printf("%d\n",((b-(b%2==1)-a-(a%2==1))>>1)+1);
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d485

d461: 班際籃球賽

內容 :
    又到了一年一度班際籃球賽的季節了,今年有 10 個班級組隊參加,比賽採單淘汰制,學校 所排的賽程如下:

    為了公平起見,學校在排賽程時,有兩個規定:
    1. 每個隊伍要取得冠軍所需贏得的比賽場數的差異不能大於一場。例如 101 贏 3 場可以獲得冠軍,但是 102 卻必須贏 4 場才可以獲得冠軍,其差異沒有大於一場。
    2. 每一場比賽的兩個隊伍必須由兩個隊數差異不大於一隊的組別所產生。例如 101, 102, 103 這三隊所產生的優勝隊伍必須和 104, 105 這兩隊所產生的隊伍比賽,兩邊所包含的隊伍數差異不大於一隊。

    在這兩個規則下,請幫忙計算如果有 n 個隊伍報名參賽,至少必須舉辦幾場比賽才能產生一個冠軍隊伍。

輸入說明 :
    輸入只有一行,包含一個整數 n,代表報名參賽的隊伍數目。

輸出說明 :
    請輸出一個整數,代表至少必須舉辦幾場比賽。

範例輸入 :
10

範例輸出 :
9

程式碼 :
#include <stdio.h>

int main() 
{
    int i;
    
    while(scanf("%d",&i)==1)
        printf("%d\n",i-1);
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d461

d460: 山六九之旅

內容 :
    小華每年都會到「山六九」主題樂園去玩,但是隨著年齡的增加,每年要買的門票也不太一樣。給你小華的年齡,請你告訴我他今年的門票多少錢?
「山六九」主題樂園的票價表如下:
    0 ~ 5 歲兒童免票
    兒童票 (6 ~ 11 歲):590 元
    青少年票 (12 ~ 17 歲):790 元
    成人票 (18 ~ 59 歲):890 元
    敬老票 (60歲以上):399 元

輸入說明 :
    輸入只有一行,內含一個整數 a (0≤a≤2147483647) 代表小華的年齡。

輸出說明 :
    依「山六九」的票價表,輸出一個整數,代表小華今年的門票價格。

範例輸入 :
15

範例輸出 :
790

提示 :
    背景知識: 算術及關係運算子
    你可以只用算術及關係運算子,而不用 if、switch、或 ? : 來寫出這題嗎? (這是「挑戰」而不是「限制」,因為出題者不是系統管理員,不能限制你用這些指令。)

程式碼 :
#include <stdio.h>

int main()
{
    int i,arr[5]={0,590,790,890,399};
    
        
    while(scanf("%d",&i)==1)
        printf("%d\n",arr[(i>5)+(i>11)+(i>17)+(i>59)]);
    return 0;
}





http://zerojudge.tw/ShowProblem?problemid=d460

d420: Q694: The Collatz Sequence

內容 :
    以下這個由Lothar Collatz定義的演算法可以產生一連串數列:
    Step1:
        任選一個正整數A作為這個數列的第一項。
    Step2:
        如果A=1則停止。
    Step3:
        如果A為偶數,則A=A/2然後重新回到Step2。
    Step4:
        如果A為奇數,則A=3*A+1然後重新回到Step2。
    這個演算法已經被證明當首項小於等於 109時這個數列最終都會在Step2停止,但是有些A值在這個數列中會超出許多電腦的整數上限。在這個問題中我們想要計算這個數列的長度,而數列的終止有兩種情況:1.最終會在Step2停止或是 2.某一項會在Step4超出一個特定的上限。

輸入說明 :
    輸入包含許多組待測資料,每一列代表一組待測資料,每組待測資料包含兩個正整數,第一個數為首項A,第二個數為這個數列的上限L,無論A或L都不會大於2,147,483,647(32位元有號整數的最大值),且首項A總是小於上限L。當輸入為兩個負數時代表輸入結束。

輸出說明 :
    對每組待測資料必須輸出它為第幾組(從1開始),一個冒號,首項A的值,上限L的值,以及此一數列的項數。(請參考sample output)

範例輸入 :
3 100
34 100
75 250
27 2147483647
101 304
101 303
-1 -1

範例輸出 :
Case 1: A = 3, limit = 100, number of terms = 8
Case 2: A = 34, limit = 100, number of terms = 14
Case 3: A = 75, limit = 250, number of terms = 3
Case 4: A = 27, limit = 2147483647, number of terms = 112
Case 5: A = 101, limit = 304, number of terms = 26
Case 6: A = 101, limit = 303, number of terms = 1

提示 :
    对不起哟,测试数据有误,已更正。10/8/2009 pm 16:00

出處 :
    ACM 694

程式碼 :
#include<stdio.h>

int main()
{
    int count,Case;
    long long a,A,l;
    
    Case = 1;
    while(scanf("%lld%lld",&a,&l)==2)
    {
        if((a<0) && (l<0))
            break;
        A = a;
        count = 1;
        while(a!=1 && a<=l)
        {
            if(a%2 == 1)
                a = a*3 + 1;
            else
                a = a / 2;
            if(a<=l)
                count++;
        }
        printf("Case %d: A = %lld, limit = %lld, number of terms = %d\n",Case++,A,l,count);
    }
    return 0;
}





http://zerojudge.tw/ShowProblem?problemid=d420

d085: 根號運算

內容 :
    根號運算
    輸入很多, 請用 EOF
    輸入 3 則為 √3
    輸入 4 則為 2
    數入 12 則為 2√3
    有負數喔
    請弄好 "i"

輸入說明 :
    一堆數字,行行排列

輸出說明 :
    一堆數字,行行排列
    注意
    √ 要用成 _/

範例輸入 :
3
4
12
-3
-4
-12

範例輸出 :
_/3
2
2_/3
_/3i
2i
2_/3i

提示 :
    聰明的人會加速
    拜託好不好
    暴力會TLE

程式碼 :
#include<stdio.h>
#include<math.h>

int main()
{
    int a,i,minus,sqr,left;
    
    while(scanf("%d",&a)==1)
    {
        if(a == 0)
        {
            printf("0\n");
            continue;
        }
        minus = 0;
        if(a < 0)
        {
            minus = 1;
            a = -a;
        }
        
        sqr = sqrt(a);
        left = 1;
        for(i=2; i<=sqr; i++)
        {
            while(a%(i*i) == 0)
            {
                left *= i;
                a /= (i*i);
            }
        }
                        
        if(left != 1)
            printf("%d",left);
        
        if(a != 1)
            printf("_/%d",a);
        
        if(minus)
            printf("i");
        printf("\n");
    }
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d085

d475: 玩具求幂题(求幂系列题2)

內容 :
    为了求幂挑战的顺利进行,请先来这儿做准备。

輸入說明 :
    每行一个a n,(a,n∈Z)当输入0 0时输出‘All Over.’和多余行数结束。

輸出說明 :
    每行一个a的n次幂的值, -2147483648<=a,n,an<=2147483647。

範例輸入 :
6 5
567 3
2 25
-1 4
-9 7
1 8388608
0 0
32 6
45 2
86 9
0 1
0 0
4 5
6 9

範例輸出 :
7776
182284263
33554432
1
-4782969
1
All Over. Exceeded 7 lines!

提示 :
    a,n中有一个空格,首尾均无多余空格。
    注意特殊数据的处理。

程式碼 :
#include<stdio.h>
#include<math.h>

int main()
{
    int a,b,line=0;
    char s;
        
    while(scanf(" %d %d",&a,&b)==2)
    {
        
        if(a==0 && b==0)
        {
            getchar();
            while(scanf("%c",&s)==1)
                if(s == '\n')
                    line++;
            printf("All Over. Exceeded %d lines!\n",line);
            break;
        }
        printf("%.0lf\n",pow(a,b));
    }        
    return 0;
}


http://zerojudge.tw/ShowProblem?problemid=d475

a104: 排序

內容 :
    幫我排個數字謝謝QQ

輸入說明 :
    有多筆測資以EOF為結束
    第一行有一個正整數n(1<=n<=1000),代表有幾個數字要請你幫忙排
    第二行有n個可以用int儲存的正整數

輸出說明 :
    輸出n個已由小到大排序好的正整數

範例輸入 :
6
7 9 0 4 1 8
8
1 9 9 0 0 9 2 8

範例輸出 :
0 1 4 7 8 9
0 0 1 2 8 9 9 9

提示 :
    背景知識: 基礎排序

程式碼 :
#include<stdio.h>

void qsort(int n[], int left, int right)
{
    int i = left, j = right+1, temp;
    int ii = left-1, jj = j;
    if(left < right)
    {
        while(1)
        {
            while((i+1)<jj && n[++i]<n[left]);
            while((j-1)>ii && n[--j]>n[left]);
            if(i >= j)
                break;
            temp = n[i];
            n[i] = n[j];
            n[j] = temp;
        }
        
        temp = n[left];
        n[left] = n[j];
        n[j] = temp;
        
        qsort(n, left, j-1);
        qsort(n, j+1, right);
    }
}

int main()
{
    int i,n[1001],len;
    
    i = 0;
    while(scanf("%d",&len)==1)
    {
        for(i=0; i<len; i++)
            scanf("%d",&n[i]);
        qsort(n,0,len-1);
    
        for(i=0; i<len; i++)
            printf("%d ",n[i]);
        printf("\n");
            
    }
    return 0;
}



http://zerojudge.tw/ShowProblem?problemid=a104

d478: 共同的數 - 簡易版

內容 :
    因為學長覺得d136太可怕,所以出一題簡單版的XD
    小潘跟小花都有很多個正整數,自己的數不會有重覆出現的,而且都是遞增排列。
    現在她們想要知道,兩個人的數有幾個重覆的呢?

輸入說明 :
    第一行有兩個數字n,m。 (1<=n<=100,1<=m<=10000)
    接著共有n筆測資,每筆測資共有兩行,分別代表兩個人擁有的數,每行共有m個數。
    所有數字都不大於2^31-1。

輸出說明 :
    每筆測資請輸出一個數字,
    代表兩個人的數有幾個重覆的。

範例輸入 :
2 6
1 5 6 8 9 13
3 4 5 7 8 11
4 6 7 14 16 23
6 9 12 13 16 23

範例輸出 :
2
3

提示 :
    如果這題AC了,可以去寫這題的進階版d136。

程式碼 :
#include<stdio.h>

int main()
{
    int i,j,n,m,same,a[2][10000];
    
    while(scanf("%d %d",&n,&m)==2)
    {
        
        while(n--)
        {
            for(i=0; i<m; i++)
                scanf("%d",&a[0][i]);
            for(i=0; i<m; i++)
                scanf("%d",&a[1][i]);
            i = j = same = 0; 
            while(i<m && j<m)
            {
                if(a[0][i] == a[1][j])
                {
                    same++;
                    i++, j++;
                }
                else if(a[0][i] > a[1][j])
                    j++;
                else
                    i++;
            }
            printf("%d\n",same);
        }
    }    
    return 0;
}



http://zerojudge.tw/ShowProblem?problemid=d478

d493: 入门求幂题(求幂系列题1)

內容 :
    求出a^n的值。

輸入說明 :
    只有一行:a,n

輸出說明 :
    一行:a^n

範例輸入 :
样例1: 3 16
样例2: -4 13

範例輸出 :
样例1: 43046721
样例2: -67108864

提示 :
一切皆在长整型内。(n≠0)
各测试点分数:20 27 12 23 18

程式碼 :
#include<stdio.h>
#include<math.h>

int main()
{
    long long a,b;
        
    while(scanf(" %lld %lld",&a,&b)==2)
        printf("%.0lf\n",pow(a,b));
    
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d493

2011年8月18日 星期四

a216: 數數愛明明

內容 :
    數數是班上聰明又漂亮的女生,有一天……,她愛上了明明。
她對明明說:「我們的愛,若是錯誤,願你我沒有白白受苦。呃,不是,我們的愛就像是函數!」
    明明說,「是啊,我對妳的愛是與日俱增呢!」
    數數開心地說,「你的意思是,你在第 n 天對我的愛若用函數 f(n) 來描述,那麼,f(n) = n + f(n-1)。也就是說,每一天都比前一天多了一單位的愛,並且與舊的愛累積起來嗎?」
明明點了點頭,然後問,「那麼,妳呢?」
    數數說,「我在第 n 天對你的愛若是 g(n),那 g(n) = f(n) + g(n-1)!」
於是,明明笑了笑,摟著數數說,我一定會更加愛妳的!
    註:在第一天的時候,f(1) = g(1) = 1。

輸入說明 :
    輸入以 EOF 結束。每一筆測試資料有一個數字 n,其中 n > 0。
此外,50% 的測資 n <= 500;80% 的測資,n <= 3000;全部的測資 n <= 30000。

輸出說明 :
    輸出 f(n) 與 g(n)。

範例輸入 :
1
2
3
5
8
13

範例輸出 :
1 1
3 4
6 10
15 35
36 120
91 455

程式碼 :
#include<stdio.h>

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







提示 :
    把遞迴拆開來,會比較好看出公式。

    =======以下是g(n)的推導過程,想自己推的可以忽略,推不出來的可以參考=======
    g(1) = 1
    g(2) =   f(2)  +g(1)
           = (2+1) + (1)
    g(3) =     f(3)    +       g(2)
           =     f(3)    +   (f(2) + g(1)) 
           = (3+2+1) + (2+1) + (1)
    g(4) =       f(4)       +           g(3)
           =       f(4)       +     (f(3)   +       g(2)) 
           =       f(4)       +     f(3)    +  (f(2)  + g(1))
           = (4+3+2+1) + (3+2+1) + (2+1) + (1)
    g(5).....以此類推

    以g(4)為例
    g(4) = 1 + (1+2) + (1+2+3) + (1+2+3+4)
           = 1+1+1+1 + 2+2+2 + 3+3 + 4
           = 1*4 + 2*3 + 3*2 + 4*1
    所以說我們可以找出一個通式 :
    g(n) = 1*n + 2*(n-1) + 3*(n-2) + ... + (n-2)*3 + (n-1)*2 + n*1 

    看到上面這個式子有沒有一種熟悉的感覺,因為那些數學家大大們可以幫我們把這些有規律的東西找到一些很簡單的式子,那就是:

    """ n(n+1)(n+2)/6 """

    PS:公式怎麼來的請看這裡
    ===================================================================



http://zerojudge.tw/ShowProblem?problemid=a216

a215: 明明愛數數

內容 :
    明明是一個愛數(ㄕㄨˇ)數(ㄕㄨˋ)的好學生,這天媽媽叫他從 n 開始數,下一個數字是 n+1,再下一個數字是 n+2,以此類推。媽媽想知道,明明數了幾個數字之後,他數過的這些數字的總和會超過 m。請幫助明明的媽媽吧。

輸入說明 :
    輸入以 EOF 結束。每一筆測試資料有兩個數字,分別為 n 和 m,其中 m-n 不會超過 10^5。

輸出說明 :
    輸出如題目敘述。

範例輸入 :
1 5
5 10
100 1000

範例輸出 :
3
2
10

程式碼 :
#include<stdio.h>

int main()
{
    int a,b,i,total;
    
    while(scanf("%d %d",&a,&b)==2)
    {
        total = 0;
        if(total <= b)
            for(i=0; total<=b; i++)
                total = total + a++;
        else
            i = 1;
        
        printf("%d\n",i);
    }    
    return 0;
}




d634: 魔法卡magic

內容 :
    繼梅蘭城的法師們在你的幫助下,成功節約符咒之後,
    他們順利大量生產了各式魔法的符咒,但是…
    符咒太多了所以把符咒室弄得亂七八糟的-▽-
    所以請你寫一個程式再度幫助他們把符咒整理好吧。

輸入說明 :
    每個測資點僅一組測資,不必EOF讀檔。
    第一行有整數n(1<n<=100000)表示接下來有n張符咒
    從第二行開始的n行
    每行有一個符咒的名稱,內容可能包含小寫字母、大寫字母、數字、空格字元。
    並且每行不超過10個字元

輸出說明 :
    請依照"檔案系統"的方法,將這n個符咒排序後的結果輸出。
    所謂檔案系統排序就是,
    對於兩個英文單字的比較以abc和xyz來說,
    先從第一個字母的"ASCII"值開始比,
    (以這題出現的ASCII來說,空格<數字<大寫字母(A~Z)<小寫字母(a~z))
    如a<x,所以abc在xyz前面。
    如果第一個字母相同,則比較下一個字母,如abx對上aby,
    比到第三位x<y,所以abx在aby前面。

範例輸入 :
7
penguin
jacker
jack doom
JACK
ws23
aszx87140
e196819

範例輸出 :
JACK
aszx87140
e196819
jack
doom
jacker
penguin
ws23

提示 :
背景知識: 排序
1.字串排序
2.共三個測資點30%、35%、35%,
第一個測資點即範例測資。

程式碼 :
#include<stdio.h>
#include<string.h>

char s[100000][11],temps[11];

void qsort(int left, int right)
{
    int i = left, j = right+1, temp;
    int ii = left-1, jj = j;
    if(left < right)
    {
        while(1)
        {
            while((i+1)<jj && strcmp(s[++i],s[left])<0);
            while((j-1)>ii && strcmp(s[--j],s[left])>0);
            if(i >= j)
                break;
            
            strcpy(temps,s[i]);
            strcpy(s[i],s[j]);
            strcpy(s[j],temps);
        }
        
        strcpy(temps,s[left]);
        strcpy(s[left],s[j]);
        strcpy(s[j],temps);
        
        qsort(left, j-1);
        qsort(j+1, right);
    }
}

int main()
{
    int i,j,n,temp,arr[100000];
        
    while(scanf("%d",&n)==1)
    {
        getchar();
        for(i=0; i<n; i++)
            gets(s[i]);
        
        qsort(0,n-1);
        
        for(i=0; i<n; i++)
            printf("%s\n",s[i]);
    }
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d634

d075: 快速排序

內容 :
    快速排序.
    用O(n2)的會咻~碰

輸入說明 :
    只有一組測資
    就是把檔案中所有的數字排序
    請用EOF
    請將n 由大排到小.
    至多有 100001 個數字(我本來就想讓大家MLE...

輸出說明 :
    請將 排序好的數列 輸出
    記得要間隔
    不必換行.

範例輸入 :
1 4 3 5 2

範例輸出 :
5 4 3 2 1

程式碼 :
#include<stdio.h>

void qsort(int n[], int left, int right)
{
    int i = left, j = right+1, temp;
    int ii = left-1, jj = j;
    if(left < right)
    {
        while(1)
        {
            while((i+1)<jj && n[++i]>n[left]);
            while((j-1)>ii && n[--j]<n[left]);
            if(i >= j)
                break;
            temp = n[i];
            n[i] = n[j];
            n[j] = temp;
        }
        
        temp = n[left];
        n[left] = n[j];
        n[j] = temp;
        
        qsort(n, left, j-1);
        qsort(n, j+1, right);
    }
}

int main()
{
    int i,j,n[100000];
    char nouse;
    
    i = 0;
    while(scanf("%d%c",&n[i++],&nouse)==2)
    {
        if(nouse == '\n')
        {
            qsort(n,0,i-1);
    
            for(j=0; j<i; j++)
                printf("%d ",n[j]);
            printf("\n");
            
            i = 0;
        }
    }
    return 0;
}



http://zerojudge.tw/ShowProblem?problemid=d075

d626: 小畫家真好用

內容 :
    Windows的小畫家真好用!
    (至少在處理PrintScreen方面蠻快的…)
    大家都知道
    小畫家裡面有一種繪圖工具
    叫做油漆桶工具
    只要選定你要的顏色、油漆的地點就可以進行填色
    油漆桶的填色範圍是取決於"同色塊相鄰"的原則
    現在請你模擬這項工具

輸入說明 :
    每個測資點只有一筆測資。
    第一行有整數n(1<=n<=100)表示這張圖的大小是(n*n)個字元
    接下來的n行,每行n個字元表示這張圖的樣子。
    只有+、-兩種字元組成(兩種顏色的意思)
    在最後一行,有兩個整數i,j表示油漆桶點擊的地點是第(i+1)列第(j+1)個字元,
    [
    假設有圖如下3*3:
    012
    0---
    1-+-
    2-++
    那麼0,2就表示這格:
    012
    0--*
    1-+-
    2-++
    ]
    請視選取的顏色為+,選取的位置原本的顏色必為-
    並且墨水只會利用上下左右四個方位擴散

輸出說明 :
    請直接輸出經過油漆桶塗色後的圖案

範例輸入 :
7
-------
-+++---
-+--+--
-+---+-
--+++--
---++--
-------
3 4

範例輸出 :
-------
-+++---
-++++--
-+++++-
--+++--
---++--
-------

提示 :
測資給定的i,j是0,0…嘿嘿嘿

程式碼 :
#include<stdio.h>
int n;
char map[101][101];

void print(int a, int b)
{
    if(a<0 || b<0 || a==n || b==n)
        return ;
    if(map[a][b] == '+')
        return ;
    map[a][b] = '+';
    print(a+1,b);
    print(a-1,b);
    print(a,b+1);
    print(a,b-1);
}

int main()
{
    int a,b,i,j;
        
    while(scanf("%d",&n)==1)
    {
        for(i=0; i<n; i++)
            for(j=0; j<n; j++)
                scanf(" %c",&map[i][j]);

        scanf("%d %d",&a,&b);
        
        print(a,b);
        
        for(i=0; i<n; i++)
        {
            for(j=0; j<n; j++)
                printf("%c",map[i][j]);
            printf("\n");
        }
    }    
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d626

2011年8月17日 星期三

d623: 反方陣

內容 :
    genius0615上課時總是在打手機不聽老師上課
    有一天老師在上矩陣時終於爆發了!!!
    老師處罰他寫1千題的反方陣(定義在下面的提示)
    在他欲哭無淚時
    突然想到有ZJ這個網站
    找個大神幫他寫程式作業一下就秒殺了
    於是他把這題貼到了上面
    現在就麻煩大神們幫他寫個程式
    秒殺這些題目吧

輸入說明 :
    輸入有兩行每行有2個數字代表2階方陣
    輸入4個0表示結束

輸出說明 :
    輸出此方陣的反方陣精準到小數點以下第5位
    若此方陣無反方陣則輸出cheat!

範例輸入 :
1 2
3 4
1 1
1 1
0 0
0 0

範例輸出 :
-2.00000 1.00000
1.50000 -0.50000
cheat!

提示 :
背景知識: 反方陣
反方陣是個類似指數的-1次方的東西
換句話說方陣乘以反方陣會等於單位方陣
單位方陣的定義是任何方陣乘以它之後值不變
矩陣乘法可參考:
http://zerojudge.tw/ShowProblem?problemid=d481

程式碼 :
#include<stdio.h>

int main()
{
    int a[4],temp;
    
    while(scanf("%d %d %d %d",&a[0],&a[1],&a[2],&a[3])==4)
    {
        if(a[0]==0 && a[1]==0 && a[2]==0 && a[3]==0)
            break;
        temp = a[0]*a[3] - a[1]*a[2];
        if(temp == 0)
            printf("cheat!\n");
        else
            printf("%.5f %.5f\n%.5f %.5f\n",(float)a[3]/temp,(float)-a[1]/temp,(float)-a[2]/temp,(float)a[0]/temp);
    }
    
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d623

d732: 二分搜尋法

內容 :
    給你一個嚴格遞增的數列A1,A2,A3.....An(1<=n<=100000),
    &下面有幾個問題的詢問數k(1<=K<=100000),
    以及k個詢問的整數x,求數列中是否存在一個Ai(1<=i<=n)的值與X相等?

輸入說明 :
    第一行包含兩個整數n,k分別表示數列長度以及詢問數,
    第二行包含n個整數第i(1<=i<=n)個整數依序為數列中Ai的值,
    第三行包含k個詢問的整數x.

輸出說明 :
    對於每個詢問整數x對應一行輸出:
    輸出 i 的值
    其中1<=i<=n且Ai=x
    若沒有這樣的i值請輸出0代替.

範例輸入 :
5 5
1 3 4 7 9
3 1 9 7 -2

範例輸出 :
2
1
5
4
0

程式碼 :
#include<stdio.h>

int binarysearch(int a[], int head, int tail, int x)
{
    int mid;
        
    while(head <= tail)
    {
        mid = (head + tail) / 2;
        if(a[mid] < x)
            head = mid + 1;
        else if(a[mid] > x)
            tail = mid - 1;
        else
            return mid;
    }    
    return -1;
}

int main()
{
    int i,x,n,k,a[100001];
    
    while(scanf("%d %d",&n,&k)==2)
    {
        for(i=0; i<n; i++)
            scanf("%d",&a[i]);
        for(i=0; i<k; i++)
        {
            scanf("%d",&x);
            printf("%d\n",binarysearch(a,0,n-1,x)+1);
        }
    }    
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d732

d985: Gran Turismo 5

內容 :
    最近,
    學姊籌錢買了一片 Gran Turismo 5 回家做賽車夢,又另外買了 G27 方向盤,但在賽車場上的表現始終不如人意。

    "車,不是這麼開的。"
    說完爸爸接過了方向盤,將記錄一次又一次的刷新。
    給你每一圈的時間紀錄,請算出 Best Lap 與平均時間。
    我一定要成為車神!

輸入說明 :
    第一行有一個數字 N (0 < N ≤ 10)
    代表接下來有 N 組測試資料
    每組測試資料第一行有一個數字 M (0 < M ≤ 100)
    接著有 M 行資料
    每行兩個數字 A, B (0 ≤ A, B ≤ 60)
    代表該圈所花費時間為 A 分 B 秒

輸出說明 :
    Track X:
    Best Lap: X minute(s) X second(s).
    Average: X minute(s) X second(s).
    Average 為整數,小數部份無條件捨去
    詳請參考範例測資

範例輸入 :
3
4
1 54
2 02
1 58
1 50
3
1 23
1 42
1 37
5
3 00
2 56
3 04
2 50
3 01

範例輸出 :
Track 1:
Best Lap: 1 minute(s) 50 second(s).
Average: 1 minute(s) 56 second(s).

Track 2:
Best Lap: 1 minute(s) 23 second(s).
Average: 1 minute(s) 34 second(s).

Track 3: Best Lap: 2 minute(s) 50 second(s).
Average: 2 minute(s) 58 second(s).

程式碼 :
#include<stdio.h>

int main()
{
    int i,j,A,B,N,M,best_m,best_s,avg_m,avg_s;
    
    scanf("%d",&N);
    N++;
    for(i=1; i<N; i++)
    {
        scanf("%d",&M);
                
        avg_m = avg_s = 0;
        best_m = best_s = 70;
        
        for(j=0; j<M; j++)
        {
            scanf("%d %d",&A,&B); 
                       
            avg_m += A;
            avg_s += B;    
                    
            if((A < best_m) || ((best_m==A) && (best_s>B)))
            {
                best_m = A;
                best_s = B;
            }
        }
        
        avg_s = (avg_m*60 + avg_s)/M;
        avg_m = avg_s / 60;
        avg_s = avg_s % 60;
        
        printf("Track %d:\n",i);
        printf("Best Lap: %d minute(s) %d second(s).\n",best_m,best_s);
        printf("Average: %d minute(s) %d second(s).\n",avg_m,avg_s);
    }    
    return 0;
}






http://zerojudge.tw/ShowProblem?problemid=d985

2011年8月11日 星期四

d379: 446 - Kibbles `n' Bits `n' Bits `n' Bits

內容 :
    一個很疲倦的程式設計師正在設計一支程式可以同時讀入兩個十六進位的數字,將它們相加或相減後以十進位表示法輸出。同時,這兩個十六進位數字的二進位表示法也必須輸出,就像下面sample output的格式一樣。
    這位程式設計師很樂意自己完成這個普通的小程式,但是當他試著做基底2的轉換時,他卻突然感染了麻疹。所以如果你願意幫他完成這支小程式,他會非常地感謝你。
    你可以假設以下條件總是成立:
    在讀入的十六進位數字中最大不超過FFF。
執行減法運算時第二個數字永遠比第一個數小,也就是說,運算結果不會是負的。
空白字元在整個輸入檔中會以統一格式出現,也就是說每行的開頭不會有空白字元,在個數字及運算元之間會有一空白字元。(請參考sample input)

輸入說明 :
    這個題目的輸入來自一個由下列格式組成的檔案:
    N (代表有N個運算式要計算)
    十六進位1 (+ 或 -) 十六進位2 (第一個運算式))
    .
    .
    .
    十六進位1 (+ 或 -) 十六進位2 (第 N 個運算式)

輸出說明 :
    輸出檔必須遵守以下格式:
    二進位1 (+ 或 -) 二進位2 = 十進位 (第一個運算結果)
    .
    .
    .
    二進位1 (+ 或 -) 二進位2 = 十進位 (第 N 個運算結果 )

範例輸入 :
2
A + 3
AAA + BBB

範例輸出 :
0000000001010 + 0000000000011 = 13
0101010101010 + 0101110111011 = 5733

提示 :
* 中文翻譯:Lucky 貓
C/C++
可以直接用%x 輸入,讀入16進位數

出處 :
Uva 446 (管理:morris1028)

程式碼 :
#include<stdio.h>

void bin(int num)
{
    int i,b[13]={0};
    for(i=0; num!=1 && i<13; i++)
    {
        b[i] = num % 2;
        num = num / 2;
    }
    b[i] = num;
    for(i=12; i>-1; i--)
        printf("%d",b[i]);
}

int main()
{
    int i,n,a,b;
    char op;
    
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        scanf("%x %c %x",&a,&op,&b);
        bin(a);
        printf(" %c ",op);
        bin(b);
        if(op == '+')
            printf(" = %d\n",a+b);
        else
            printf(" = %d\n",a-b);
    }
    return 0;
}
http://zerojudge.tw/ShowProblem?problemid=d379

d356: NOIP2002 1.级数求和

內容 :
    已知:Sn= 1+1/2+1/3+…+1/n。显然对于任意一个整数K,当n足够大的时候,Sn大于K。
    现给出一个整数K(1<=k<=15),要求计算出一个最小的n;使得Sn>K。

輸入說明 :
    键盘输入 k

輸出說明 :
    屏幕输出 n

範例輸入 :
1

範例輸出 :
2

出處 :
NOIP2002普及组第一题 (管理:liouzhou_101)

程式碼 :
#include<stdio.h>

int main()
{
    int n;
    double k,sn;
    
    while(scanf("%lf",&k)==1)
    {
        for(sn=1,n=2; sn <= k; n++)
            sn = sn + (double)1/n;
        printf("%d\n",n-1);
    }
        
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d356

d281: 10499 - The Land of Justice

內容 :
    在公平國內每件東西的售價都是固定的。沒有人能夠買入一個東西後用2倍的價錢賣出去。但是這也產生了市場問題,大家都不做生意而跑去做製造了。所以過了不久之後,每個人都在製造東西,但卻沒有人在做生意。這使得人們沒有辦法得到日常所需,雖然這個國家在各方面都可以自給自足。
    政府變的非常緊張了,他們找來了數學家們。數學家們提供了一個解決方案。他們建議賣東西時不以體積計價,而以表面積計價。
    現在,政府要求程式設計師建立所需軟體來計算利潤。
    你的任務就是計算賣一東西(固體的球體)的利潤。商人買來一個球體然後把它切割成相等的 n 等分出售。所有的切割一定都通過球體的軸心,如下圖一般:



輸入說明 :
    輸入含有多組測試資料。每組測試資料一列含有一正整數 n(0 < N < 231)。
    若 n 為負數,代表輸入結束,請參考Sample Input。

輸出說明 :
    對每組測試資料輸出一列,輸出商人將一實體圓球切割成相等的 n 等分後,可以獲得的利潤。以百分比表示,四捨五入到整數位數。

範例輸入 :
2
2
-1

範例輸出 :
50%
50%

出處 :
    ACM 10499 (管理:pcsh710742)

程式碼 :
#include <stdio.h>

int main()
{
    long long n;
    
    while(scanf("%lld",&n)==1)
    {
        if(n < 0)
            break;
        if(n == 1)
            printf("0%%\n");
        else
            printf("%lld%%\n",n*25);
    }
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d281

d261: 11000 - Bee

內容 :
    在非洲有一種非常特別的蜜蜂。每一年母蜂會生一隻公蜂,而公蜂會生一隻公蜂和一隻母蜂,然後死去。
    現在,科學家在偶然中發現了一隻這種品種的母蜂,而且這是一隻「神奇」的母蜂,因為她永遠都不會死,而且每年都可以像其他正常的母蜂一樣生一隻公蜂。科學家想要知道,在 N 年後會有多少隻蜜蜂。請寫一個程式幫他們算出在 N 年後公蜂的數目以及所有蜜蜂的數目。
輸入說明 :
輸入含有多組測試資料。每組測試資料一列,有1個正整數 N( N >= 0)。

    當 N = -1 時代表輸入結束。請參考Sample Input。

輸出說明 :
    對每一組測試資料輸出一列,第一個數字為N年後公蜂的數目,第二個數字為N年後所有蜜蜂的數目。
    這2個數都不會超過 232。

範例輸入 :
1 3 -1

範例輸出 :
1 2 4 7

出處 :
    ACM 11000

程式碼 :
#include<stdio.h>

int main()
{
    int i,year;
    long long male,female,temp_male,temp_female;
    
    while(scanf("%d",&year)==1)
    {
        if(year < 0)
            break;
        
        male = 0;
        female = 1;
        
        for(i=0; i<year; i++)
        {
            temp_female = 1 + male;
            temp_male = female + male;
            male = temp_male;
            female = temp_female;
        }
        printf("%lld %lld\n",male,male+female);
    }
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d261

c082: Mutant Flatworld Expolrers

內容 :
    給你一塊矩形土地的長寬,再依序給定每個機器人的初始位置狀況及一連串的指令集,你必須用你的程式求出每個機器人最後的位置狀況。
    一個機器人的位置狀況包括了其坐標( x 坐標, y 坐標),和它面向的方向(用 N , S , E , W 來分別代表北、南、東、西)。至於一個機器人所收到的指令集,是一個由字母 ' L ' , ' R ' , 和 ' F ' 所構成的字串,其分別代表:

    左轉(Left):機器人在原地往左轉 90 度。
    右轉(Right): 機器人在原地往右轉 90 度。
    前進(Forward): 機器人往其面向的方向向前走一格,且不改變其面向之方向。
    從坐標 (x,y) 走至 (x,y+1) 的這個方向我們定義為北方。

    因為此矩形土地是有邊界的,所以一旦一個機器人走出邊界掉落下去,就相當於永遠消失了。不過這個掉下去的機器人會留下「標記 ( scent ) 」,提醒以後的機器人,避免他們從同一個地方掉下去。掉下去的機器人會把標記,留在他掉落之前所在的最後一個坐標點。所以對於以後的機器人,當他正位在有標記的地方時,這個機器人就會忽略會讓他掉下去的指令。

輸入說明 :
    輸入裡的第一列有2個正整數,代表這個矩形世界右上角頂點的坐標,其中假設這個世界的左下角頂點坐標為 ( 0 , 0 )。

    接下來是若干組有關機器人的初始位置狀況和指令集,每個機器人2列。第一列為位置狀況,包括了兩個整數和一個字元( N , S , E 或 W ),代表機器人初始的位置坐標以及機器人最初所面對的方向。第二列則是指令集,是一個由 ' L ' , ' R ' 和 ' F ' 所組成的字串。輸入以 end-of-file 作為結束。

    各機器人是依序動作的,也就是說,直到一個機器人作完他全部的動作,下一個機器人才會開始動作。

    所有機器人的初始位置皆會在矩形土地上,不會落在外面。任何坐標的最大值皆不會超過 50 。每個指令集的長度皆不會超過 100 個字元長。

輸出說明 :
    對於每一個機器人,你都必須輸出其最後所在的坐標和面對的方向。如果一個機器人會掉落出此世界外,你必須先輸出他在掉落前,最後的所在位置和面對的方向,再多加一個字: LOST 。

範例輸入 :
5 3
1 1 E
RFRFRFRF
3 2 N
FRRFLLFFRRFLL
0 3 W
LLFFFLFLFL

範例輸出 :
1 1 E
3 3 N LOST
2 3 S

出處 :
    ACM 118

程式碼 :
#include<stdio.h>
#include<string.h>

char where(int direction)
{
    switch(direction)
    {
        case 0:
            return 'E';
        case 1:
            return 'S';
        case 2:
            return 'W';
        case 3:
            return 'N';
    }
}

int main()
{   
    int i,j,len,boundx,boundy,locatex,locatey,nextx,nexty,direction,map[51][51];
    char d,s[101];
    
    scanf("%d %d",&boundx,&boundy);
    
    for(i=0; i<50; i++)
        for(j=0; j<50; j++)
            map[i][j] = 1;
    
    while(scanf("%d %d %c",&locatex,&locatey,&d)==3)
    {
        
        scanf("%s",s);
        len = strlen(s);
        
        if(d == 'E')
            direction = 0;
        else if(d == 'S')
            direction = 1;
        else if(d == 'W')
            direction = 2;
        else if(d == 'N')
            direction = 3;
        
        for(i=0; i<len; i++)
        {
            if(s[i] == 'L')
                direction = (direction + 3) % 4;
            else if(s[i] == 'R')
                direction = (direction + 1) % 4;
            else
            {
                nextx = locatex;
                nexty = locatey;
                
                switch(direction)
                {
                    case 0:
                        nextx++;
                        break;
                    case 1:
                        nexty--;
                        break;
                    case 2:
                        nextx--;
                        break;
                    case 3:
                        nexty++;
                        break;
                }
               
                if(nextx<0 || nexty<0 || nextx>boundx || nexty>boundy)
                {
                    if(map[nextx][nexty] == 1)
                    {
                        map[nextx][nexty] = 0;                    
                        break;
                    }                    
                }
                else
                {
                    locatex = nextx;
                    locatey = nexty;
                }
            }
        }
        if(i == len)
            printf("%d %d %c\n",locatex,locatey,where(direction));
        else
            printf("%d %d %c LOST\n",locatex,locatey,where(direction));
        
    }
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=c082