227ウィジェット工場(ガウスの消去法)パンチをAcWing

トピックhttps://www.acwing.com/problem/content/description/229/

質問の意味:多くの部分がありますが、生産時間の各部分を持って、求める曜日及び各ワーカーの生産部品の完了の日付の製造日の数週間はありますが、今は何を知っている、3-9間の日であります各メンバーの特定の製造日

アイデア:まず、二週間によると、私たちが実際に特定の時間を計算することができ、その後、我々は部品の数を生成するために、各ワーカーは、まだ時間があり、私たちは、私たちが排除を得ることができ、非常に多くの方程式と同等のものを構築することができます答え

治療内容の3-9日間の範囲でできることに注意してください

 

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
#define N 305
 チャー日[] [ 20 ] = { "" " MON "" "" WED "" THU "" FRI "" SAT "" SUN " }。
INTのN、M、K、マット[N] [N]、ANS [N]。
 
int型の GCD(int型
    を返します他の リターン GCD(B、%のB)。
} 
BOOL mul_solu。
BOOLガウス(int型のマット[N] [N]、int型 M、int型N)
{ 
    mul_solu = int型の行、COL。
    (行= 0、COL = 0 ;行<M && COL <N ++行、++ COL)
    { 
        int型、P = 行。
        INT J =行+ 1 <; ++ M J J)
             であれば(ABS(マット[J] [COL])>ABS(MAT [P] [COL]))
                P = J;
         IF!(P = 行)
        { 
            ためINT J = 0 ; J <= N-; ++ J)
                スワップ(MAT [行] [J]、MAT [P] [J]); 
        } 
        IF(MAT [行] [COL] == 0// 最大この列は、以下の説明0が全て0である
        {  - ;
             続行; 
        } 
        ためINT J = +行1。 ; J <M; ++ J)
        { 
            int型 GG =GCD(マット[行] [COL]、マット[J] [COL])。
            INT MULI =マット[J] [COL] / GG%7 INT mulj =マット[行] [COL] / GG%7 int型 K = COL; K <= N; ++ K)
            { 
                マット[J] [K] =マット[J] [K] * muljマット[行] [K] * MULI。
                マット[J] [K] =(マット[J] [K]%7 + 7)%7 
            } 
        } 
    } 
    のためのint型 ;私がm <++ I I =行)// 矛盾必须先与複数判断
        する場合(マット[I] [N])
            返す ;
    もし(行<N)// 自由変数少
    { 
        mul_solu = 返す ; 
    } 
    
    のためにint型 I = N- 1、I> = 0 ; - I)
    { 
        ブールフラグ= INT J = 3、J <= 9 ; ++ j)は
        { 
            int型 RR = 0 int型 kは= I + 1; ++; N <K K)
                RRマット* + =マット[K] [N] [i]と[K]%7、= RRの%7 
            RR + = jは*のマット[i]は[I];
            もし(RR%7 ==のマット[I] [N])
            { 
                マット[I] [N] = J。
                フラグ = 破ります; 
            } 
        } 
        もし(!フラグ)
             を返す 
    } 
 
    を返す 
} 
 
int型 GET_TIME(CHAR* T1、チャー *のT2)
{ 
    int型ST、編。
    以下のためにint型 i = 1 ; iが<= 7 ; ++ I)
    { 
        場合(のstrcmp(T1、日[I])== 0 
            、ST = I。
        もし(のstrcmp(T2、日[I])== 0 
            ED = I。
    } 
    であれば(ED-ST> = 0 戻り ED-ST + 1 それ以外の 戻り編+ 8 - ST; 
} 
チャーT1 [ 10 ]、T2 [ 10 ]。
int型のTT;
INT メイン()
{ 
    一方(のscanf(" %d個の%のD "、&​​N、&M)=!EOF)
    { 
        場合(N == 0 && m個の== 0ブレーク
        memset(マット、0はsizeof (マット))。
        以下のためにint型 i = 0 ; iがmを<; ++ I)
        { 
            scanf関数(" %D%S%S "、&K、T1、T2)。
            マット[I] [N] = GET_TIME(T1、T2)%7 ;
            INT J = 1 ; J <= K; ++ j)は
            { 
                scanf関数(" %のD "、およびTT); 
                マット[i]は[TT - 1 ] ++ ; 
                マット[I] [TT - 1 ]%= 7 
            } 
        } 
        もし(ガウス(マット、M、N))
        { 
            場合(mul_solu)
            { 
                のprintf(" 複数のソリューション\ N。" ); 
            } 
            
            { 
                ためint型 i = 0 ; iはN- < 1 ++; I)
                    (printfの" %dを" [I] [n]は、マット)。
                printf(" %d個の\ n "、マット[N- 1 ] [N])。
            } 
        } 
        のprintf(" 一貫性のないデータ\ n " ); 
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/Lis-/p/11294154.html