2011年6月26日 星期日

a130: 12015 - Google is Feeling Lucky

內容 :
    Google 為最有名的網路搜尋引擎之一,它也提供許多網路服務與產品。在它的搜尋首面上有一個有趣的按鈕「好手氣」吸引了我們的目光。這個功能讓使用者跳過搜尋結果頁面而直接進入排名最高的頁面。真是省時又好用!
    問題是,當按下「好手氣」時到底會出現哪一個頁面?Google 有個不錯的方式來處理。為了簡化問題,假設 Google 為每個頁面設定了一個整數的相關度。相關度最高的頁面就會中選。如果平分,所有的相關度最高的頁面都有可能中選。
    給你 10 個頁面及相關度,請選出所有可能成為「好手氣」的頁面。

輸入說明 :
    輸入有多筆測資。輸入的第一行有測資的筆數 T。
    每筆測資中有 10 行以描述頁面及相關度。每行含有一個不含空白的字串代表頁面的網址及一個整數 Vi 代表該頁面的相關度。網址的長度介於 1 到 100 之間(含)。(1<= Vi <= 100)

輸出說明 :
    對於每筆測資,輸出可能中選的頁面網址。網址出現的順序與輸入相同。輸出格式請參考輸出範例。

範例輸入 :
2
www.youtube.com 1
www.google.com 2
www.google.com.hk 3
www.alibaba.com 10
www.taobao.com 5
www.bad.com 10
www.good.com 7
www.fudan.edu.cn 8
www.university.edu.cn 9
acm.university.edu.cn 10
www.youtube.com 1
www.google.com 2
www.google.com.hk 3
www.alibaba.com 11
www.taobao.com 5
www.bad.com 10
www.good.com 7
www.fudan.edu.cn 8
acm.university.edu.cn 9
acm.university.edu.cn 10

範例輸出 :
Case #1:
www.alibaba.com www.bad.com acm.university.edu.cn
Case #2:
www.alibaba.com

出處 :
    UVa ACM 12015

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

int main()
{
    int i,j,n,associate,max_associate,point;
    char site[10][102],stemp[102];
    
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        max_associate = -1;
        point = 0;
        for(j=0;j<10;j++)
        {
            scanf("%s %d",stemp,&associate);
            if(associate > max_associate)
            {
                max_associate = associate;
                point = 0;
                strcpy(site[point++],stemp);
            }
            else if(associate == max_associate)
                strcpy(site[point++],stemp);
        }
        
        printf("Case #%d:\n",i+1);
        for(j=0;j<point;j++)
                printf("%s\n",site[j]);
        
    }
    return 0;
}



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

2011年6月21日 星期二

d290: 完全數

內容 :
    完全數是除本身外所有因數之和等于該數的數。
    早在公元2世紀末,人們已經找到了前4个完全數:6,28,496,8128。
    直到13世紀,時隔千年,才有人找到了第5個完全數,你知道它是多少嗎?

輸入說明 :
    <無>

輸出說明 :
    輸出第5個完全數。

程式碼 :
#include<stdio.h>
#include<math.h>
int main()
{
    long i,j,test,sum,sqr,temp;
    
    for(i=11;;i++)
    {
        test = (1<<(i-1))*((1<<i)-1);//wiki公式
        sum = 1;
        sqr = sqrt(test)+1;
        
        for(j=2;j<sqr;j++)
        {
            if(test%j == 0)
            {
                temp = test / j;
                sum = sum + j + temp;
                if(j == temp)
                    sum = sum - j;
            }
        }
        sum = sum - test;
        if(sum==0)
        {
            printf("%d\n",test);
            break;
        }
    }
    return 0;
}



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

d277: 矩形对角线

內容 :
    同學們要在廣場上布置一個矩形花壇,計畫用“串紅”擺成對角線。如果一條對角線用了N盆,還需要多少盆“串紅”呢?

輸入說明 :
    每行一個N(0<n<2^31).

輸出說明 :
    輸出還需多少盆。

範例輸入 :
38

範例輸出 :
38

提示 :
初中几何。

解題概念 :
                                    o o o o
               o o o             o o o o
               o o o             o o o o
               o o o             o o o o
還要        2盆                 4盆

程式碼 :
#include <stdio.h>

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


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

d235: Q10929: You can say 11

內容 :
    你的任務是,給你一個正整數 N,判定它是否是 11 的倍數。

輸入說明 :
    每列資料有一個正整數N,N 最大可能到 1000 位數。
    若 N = 0 代表輸入結束

輸出說明 :
    對每個輸入的數,輸出是否為 11 的倍數。
    輸出格式請參考 Sample Output。

範例輸入 :
112233
30800
2937
323455693
5038297
112234
0

範例輸出 :
112233 is a multiple of 11.
30800 is a multiple of 11.
2937 is a multiple of 11.
323455693 is a multiple of 11.
5038297 is a multiple of 11.
112234 is not a multiple of 11.

出處 :
    ACM 10929

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

int main() 
{
    int i,sum;
    char s[1001];
    
    while(scanf("%s",s)==1)
    {
        if(s[0]=='0' && s[1]=='\0')
            break;
        for(sum=i=0;s[i]!='\0';i++)
        {
            sum = sum + s[i++] - '0';
            if(s[i]=='\0')
                break;
            sum = sum - s[i] + '0';
        }
        
        if(sum%11 == 0)
            printf("%s is a multiple of 11.\n",s);
        else
            printf("%s is not a multiple of 11.\n",s);
    }    
    return 0;
}



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

d212: 東東爬階梯

內容 :
    東東有個嗜好,爬階梯不是一次走一階,就是一次走兩階。
    換句話說,假設階梯有三階,那他有三種走法
    一:第一步走一階,第二步走二階。
    二:第一步走二階,第二步走一階。
    三:全程都走一階。
    這題要問你,假設階梯有n階,那東東有幾種走法?

輸入說明 :
    第一行有一個正整數n,0<n<100,表示階梯有n階。

輸出說明 :
    請輸出n個階梯有幾種走法。

範例輸入 :
1
2
5

範例輸出 :
1
2
8

程式碼 :
#include <stdio.h>

int main() 
{
    int i,n;
    long long arr[101];
    
    arr[1] = 1;
    arr[2] = 2;
    
    for(i=3;i<100;i++)
        arr[i] = arr[i-1] + arr[i-2];
    
    while(scanf("%d",&n)==1)
        printf("%lld\n",arr[n]);
    
    return 0;
}

印出所有情況的程式碼 :
#include<stdio.h>

int n,map[100];

void DFS(int sum, int step)
{
    if(sum == n)
    {
        for(int i=0; i<step; i++)
            printf("%d",map[i]);
        printf("\n");
        return;
    }
    else if(sum > n)
        return;
    
    map[step] = 1;
    DFS(sum+1, step+1);
    
    map[step] = 2;
    DFS(sum+2, step+1);
}

int main()
{
    int sum, step;
    
    while(scanf("%d",&n)==1)
    {
        sum = 0;
        step = 0;
        DFS(sum, step);
    }
        
    return 0;
}


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