2011-06-28 16:14:59Morris

b254. C. 矢量星球

b254. C. 矢量星球

內容 :

我 們現在都生活在三維的世界裡,對更高維度的東西總是難以想像。但是在矢量星球中,他們的世界是個n個維度的空間。在這空間中,有種叫矢量的東西。它是一個 n-序對,代表一個點相對於星球中心的位置。 羅敷跟小瀠是矢量星球上的好朋友,他們最喜歡玩的遊戲就是「Orthogonoal Family」,這個遊戲要怎麼玩呢?規則如下: 因為羅敷年紀比較小,所以從羅敷開始。接下來小瀠跟羅敷輪流做以下事情。 畫一條矢量v=(v1 , v2 , v3 , … , vn)。 檢查是否跟之前畫的矢量都垂直。如果是的話,就繼續。不然畫的那個人就輸了。 然而,他們已經大戰幾百回合,卻無法檢查是否遊戲已經結束了。看來檢查垂直這件事情似乎沒有這麼容易,因此她們想要請你寫一支程式幫忙。 兩條矢量u,v垂直,若寫成v=(v1 , v2 , v3 , … , vn), u=(u1 , u2 , u3 , … , un),v1 u1+ v2 u2+ …vn un=0。 給你他們玩樂的紀錄,你要決定遊戲的結果。

輸入說明 :

每 一組遊戲由兩個整數n,m開頭的一行,代表在n維度的空間(0<n<100000),已經玩了m個回合。(0<m<500)。接 下來是m行,每一行都由一個整數k(0<k<1000)代表這條線v表成(v1 , v2 , v3 , … , vn)有幾個vi非零,接下來會依序給予空白分開之整數對”i:d”代表vi=d。(0<i<=n, d=1或-1) 一行中,後面的i一定比前面的大。 n=m=0,代表input結束。

輸出說明 :

如果羅敷已經贏了,就印出一行Rofu;如果小瀠已經贏了就印出一行Yin;如果還無法決定,就印出一行Hakuna matata。

範例輸入 :

100 4
5 1:1 2:-1 3:1 4:1 5:1
2 1:1 2:1
1 6:1
1 7:-1
2 2
1 1:1
1 1:1
0 0

範例輸出 :

Hakuna matata
Rofu

提示 :

出處 :

2009 NPSC 高中組決賽



做法 : 窮舉
把所有向量都拿出來試,參考 NPSC 補完計畫

/**********************************************************************************/
/*  Problem: b254 "C. 矢量星球" from 2009 NPSC 高中組決賽                */
/*  Language: C                                                                   */
/*  Result: AC (20ms, 4148KB) on ZeroJudge                                        */
/*  Author: morris1028 at 2011-06-27 12:31:55                                     */
/**********************************************************************************/


#include<stdio.h>
int Vi[500][1000], Vd[500][1000], Vn[500];
int check(int k) {
    int a, In1, In2, s;
    for(a = 0; a < k; a++) {
        In1 = 0, In2 = 0, s = 0;
        while(In1 < Vn[a] && In2 < Vn[k]) {
            if(Vi[a][In1] < Vi[k][In2]) In1++;
            else if(Vi[a][In1] > Vi[k][In2])    In2++;
            else
                s += (Vd[a][In1++]*Vd[k][In2++]);
        }
        if(s)   return (k&1) + 1;
    }
    return 0;
}
main() {
    int n, m, a, b;
    while(scanf("%d %d", &n, &m) == 2) {
        if(n == 0 && m == 0) break;
        int flag = 0;
        for(a = 0; a < m; a++) {
            scanf("%d", &Vn[a]);
            for(b = 0; b < Vn[a]; b++)
                scanf("%d:%d", &Vi[a][b], &Vd[a][b]);
            if(flag == 0)   flag = check(a);
        }
        switch(flag) {
            case 0: puts("Hakuna matata"); break;
            case 1: puts("Yin"); break;
            case 2: puts("Rofu"); break;
        }
    }
    return 0