Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@cp3

「恋するハッカソン」の「「制服」ゲットチャレンジ!」がクリアできない

More than 1 year has passed since last update.

問題チャレンジ中の人にはヒントになるので閲覧注意です。

完全に詰んでるっぽいので後で挑戦するまでコードを寝かせておこうと思う。

テストケース2までは通過するのだが、テストケース3で5.00秒で通過しない。
時間切れか?ループの問題?

いまは間違っているところが見つからない。

こんなときは時間をおいて見直す必要がありそうだ。

uniform.cs
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    public static void Main()
    {
        string[] inputCardOrder = Console.ReadLine().Split(' ');//最初に入力されるカードの並び順
        List<int> cardOrder = new List<int>(52);//残りカードリスト
        //-最初に入力されたカードの並び順でカードリストを作るついでに、J,Q,K,A,2のカードの強さを正しい整数値に変換しながら、カードリスト化する 3<4<5...<10<J<Q<K<A<2
        foreach (string ic in inputCardOrder)
        {
            if (ic == "A") { cardOrder.Add(14); }
            else if (ic == "2") { cardOrder.Add(15); }
            else if (ic == "J") { cardOrder.Add(11); }
            else if (ic == "Q") { cardOrder.Add(12); }
            else if (ic == "K") { cardOrder.Add(13); }
            else
            {
                cardOrder.Add(int.Parse(ic));
            }
        }
        List<int> playerRanking = cardOrder.ToList();

        //-プレイヤーの順位を計算する
        int fieldCard = -1;//場に出ているカード(-1で初期化しているのは最初のプレイヤーのカードが必ず勝利判定を通過させるために)
        int indexOfOwnerOfFieldCard = -1;
        int countOfPlayerRank = 1;
        for (int i = 0; i < 52; i++)
        {
            if (i == indexOfOwnerOfFieldCard)//--2.フィールドに出されたカードのオーナーの手番が一周回ってきてしまったとき
            {
                    while (cardOrder[i] == -1)
                    {
                        if (i < 51) i++;
                        else i = 1;
                        fieldCard = cardOrder[i] - 1;
                    }
            }else{}

            int currentPlayerCard = cardOrder[i];//--1.
            if (fieldCard < currentPlayerCard)//場に出ているカードに現在のプレイヤーの持ちカードが勝利する場合
            {
                fieldCard = currentPlayerCard;
                indexOfOwnerOfFieldCard = i;
                playerRanking[i] = countOfPlayerRank;
                countOfPlayerRank++;
                cardOrder[i] = -1;
            }else{}
            if (countOfPlayerRank > 52) { break; }//52位まで決まったらメインループを抜け出す
            else { }
            if (51 <= i && indexOfOwnerOfFieldCard != 51) { i = 1; }
            else if (51 <= i && indexOfOwnerOfFieldCard == 51) { i = 50; }
            else { }
        }

        //-回答を出力する
        foreach (var rank in playerRanking)
        {
            Console.WriteLine(rank);
        }
    }
}

けど塩漬けになりそうだなあ。。。
どこかで質問することも頭の片隅に置いておく。

追記(2018/06/05/10:38)
メインのループにカウンタを仕込んで1000万回以上のループがあった場合は
break;するようにしたら、テストケース3は0.10秒でテスト失敗となった。
入力によっては何かしらループが失敗する原因になるということだと思う。
何が原因でどう対処すればよいだろうか?
いや、このカウンタはそもそも無意味じゃないか?
本来は一億回目のループで結果が出るところを単純にループ回数制限で前倒ししてテスト失敗してるだけかもしれないし。
わからなくなってきた。考えなくては。

1
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
cp3
忘備録です。 公開を第一目的としているわけではありませんから適当なフォーマットとコンテンツだったりします。 もし何かが共有できたら、それはそれで嬉しいなと思います。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?