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

a149: 乘乘樂

內容 :
    你拿到一個整數,卻忍不住想把每個位數都乘在一起。例如看到 356 就會想要知道 3 * 5 * 6 的值為何。快寫個程式幫幫為了乘數字而快發瘋的自己吧!

輸入說明 :
    一開始有一個數字 T,表示共有幾組測試資料。
    接下來有 T 個數字 n (0 <= n < 2147483648)。

輸出說明 :
    輸出可以拯救自己的結果。

範例輸入 :
3
356
123
9999

範例輸出 :
90
6
6561

程式碼 :
#include<stdio.h>

int main()
{
    int i,n,T,temp,total;
    
    scanf("%d",&T);
    
    for(i=0; i<T; i++)
    {
        scanf("%d",&n);
        
        if(n!=0)
        {
            total = 1;
            while(n != 0)
            {
                temp = n % 10;
                n /= 10;
                total *= temp;
            }
        }
        else
            total = 0;
        printf("%d\n",total);
    }
    return 0;
}




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

a148: You Cannot Pass?!

內容 :
    你考了 n 科筆試題目,每科的滿分都是 100 分。老師說,如果平均大於 59 你就過關了。

輸入說明 :
    輸入第一行為一個數字 n,接著有 n 個正整數。

輸出說明 :
    若你被當了,請輸出「yes」,否則輸出「no」。

範例輸入 :
1 60
3 0 80 75
5 61 61 61 61 55

範例輸出 :
no
yes
no

程式碼 :
#include<stdio.h>

int main()
{
    int i,n;
    long long score,total;
    
    while(scanf("%d",&n)==1)
    {        
        for(i=total=0; i<n; i++)
        {
            scanf("%lld",&score);
            total += score;
        }
        if(total > (n*59))
            printf("no\n");
        else
            printf("yes\n");
    }    
    return 0;
}





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

a147: Print it all

內容 :
    大於 0、整數、不可以被 7 整除、小於 n,請輸出所有可能的數字。

輸入說明 :
    輸入為一個整數 n,其中 n 不大於 10000。
    若 n = 0 表示資料結束。

輸出說明 :
    輸出如前述,各個數字之間以一個空白隔開。

範例輸入 :
5
10
20
0

範例輸出 :
1 2 3 4
1 2 3 4 5 6 8 9
1 2 3 4 5 6 8 9 10 11 12 13 15 16 17 18 19

程式碼 :
#include<stdio.h>

int main()
{
    int i,n;
    
    while(scanf("%d",&n)==1)
    {
        if(n == 0)
            break;
        for(i=1; i<n; i++)
            if((i%7) != 0)
                printf("%d ",i);
        printf("\n");
    }    
    return 0;
}




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