2016-10-18 5 views
-3

Asanaは、同僚間のタスク割り当てを合理化するために設計されたスマートワークロード機能を検討しています。新しく作成されたタスクは、最も軽い作業負荷でチームメンバーに自動的に割り当てられます。以下の情報が知られているi番目の人のために:smartベクトルのプロパティに基づいて割り当て

namesi - their name, a string containing only uppercase and lowercase letters; 
statusesi - their vacation indicator status, which is true if the person is on a vacation, or false otherwise; 
projectsi - the number of projects they are currently involved in; 
tasksi - the number of tasks assigned to the report. 

人の休暇の指標値がtrueに設定されている場合、これは、彼らが休暇にあり、新しいタスクを割り当てることができないことを意味します。逆に、バケーション・インジケータ値がfalseの場合、タスク割当てを受け取るために開かれていることを意味します。

アサナはチームのメンバーを在庫状況に応じて選別します。これらの数値が等しいが、AがBよりも割り当てられたプロジェクトの数が少ない場合、人物Aは人物Bよりも可用性が高くなります。言い換えれば、人物Aは人よりも可用性が高いB(タスク、プロジェクト)のペアがBの同じペアよりも小さい場合はBを選択します。

あなたのタスクは、可用性の最も高い人の名前を見つけることです。そのような人がちょうど1人いることが保証されています。ステータス=偽、プロジェクト= 2とタスク= 16で、

"ジョン";:

は例

For names = ["John", "Martin"], statuses = [false, false], 
projects = [2, 1] and tasks = [16, 5], 
the output should be 
smartAssigning(names, statuses, projects, tasks) = "Martin". 

引数は2人のチームメンバーに関する情報を表します ここで、JohnとMartinの休暇インジケータはどちらも真であるため、両方とも新しい割り当てに対応しています。マーティンは5つのタスクしか割り当てられませんが、ジョンは6が割り当てられます。

For names = ["John", "Martin"], statuses = [false, true], 
projects = [2, 1] and tasks = [6, 5], 
the output should be 
smartAssigning(names, statuses, projects, tasks) = "John". 

引数は、次のチームメンバーのためにスタンド:

状態=偽、プロジェクト= 2とタスク= 1で "ジョン"、。 status = true、projects = 1、およびtasks = 5の場合、 "Martin"は "Martin"です。 休暇インジケータがtrueのため、この例では新しいタスクを割り当てることはできません。したがって、「John」は最高の可用性を備えています。以下について

For names = ["John", "Martin"], statuses = [false, false], 
projects = [1, 2] and tasks = [6, 6], 
the output should be 
smartAssigning(names, statuses, projects, tasks) = "John". 

が与えられる。

"ジョン"、ステータス=偽、プロジェクト= 1とタスク= 6を有します。 status = false、projects = 2、およびtasks = 6の「Martin」休暇インジケータはいずれもfalseであり、それぞれ割り当てられるタスクの数は6です。ただしJohnは1つのプロジェクトMartinは2に関わっているので、Johnは最高の可用性を持っています。

これは私のコードですが、試験に合格しませんでした。私の問題は何ですか

std::string smartAssigning(std::vector<std::string> names, std::vector<bool> statuses, std::vector<int> projects, std::vector<int> tasks) { 
    int indicator=0; 
    int num_member=names.size(); 
    int count=0; 
    for (int i=0;i<num_member;i++) { 
     if(statuses[i]==false){ 
      count++; 
      indicator=i; 
     } 
     else { 
      names.erase(names.begin() + i); 
      projects.erase(projects.begin() + i); 
      tasks.erase(tasks.begin() + i); 
     } 
    } 

    if(count==1) 
     return names[indicator] ; 
    num_member=names.size(); 
    indicator=0; 
    int count_min=1; 
    int min=tasks[0]; 
    for (int i=1;i<num_member;i++) { 
     if(tasks[i]==min) count_min++; 
     else if(tasks[i]<min){ 
      min=tasks[i]; 
      indicator=i; 

     } 

     else { 
      names.erase(names.begin() + i); 
      projects.erase(projects.begin() + i); 
      tasks.erase(tasks.begin() + i); 
     } 
    } 

    if(count_min==1) 
     return names[indicator]; 

    num_member=names.size(); 
    indicator=0; 
    count_min=1; 
    min=projects[0]; 
    for (int i=1;i<num_member;i++) { 
     if(projects[i]==min) count_min++; 
     else if(projects[i]<min){ 
      min=projects[i]; 
      indicator=i; 

     }   

    } 

    if (count_min==1) return names[indicator];  
    else return ""; 
} 
+0

実行時に問題が発生しましたか?あなたはそれがあるはずのものと比較されている行動は何ですか?実際には – Hayt

+0

。私はどちらが誤りであるか分からない。私はサンプルテストに合格しましたが、隠れたテストでは失敗します。したがって、私は失敗した入力を知らない。 – user3051460

+0

'begin()+ i'はベクトルが縮小し、' i'がどんなものになるか考えてみよう。 – molbdnilo

答えて

1

要素をベクトルから削除しますが、元のサイズ全体を反復処理しています。
また、begin() + iで要素を削除した場合、iをインクリメントすると、次の候補(削除した要素ではなくbegin() + i)にスキップされます。

これは最終的に未定義の動作につながります。

フィルタリングロジックにも欠陥があります。これは、ソート問題は、私はフィルタリングによってソートしていないことによってそれを解決する最終的であるので、例えば
は、タスクリストは、[3,2,2,1]、count_min 2ではない1

を与えるであろう。

std::string smartAssigning(std::vector<std::string> names, 
          std::vector<bool> statuses, 
          std::vector<int> projects, 
          std::vector<int> tasks) 
{ 
    struct Worker 
    { 
     Worker(std::string nm, int tasks, int projects) 
      : name(nm), workload(tasks, projects) 
      {} 
     std::string name; 
     std::pair<int, int> workload; // (tasks, projects) 
     // As defined in the description. 
     bool operator<(const Worker& other) const { return workload < other.workload; } 
    }; 

    // Gather the people that are available. 
    std::vector<Worker> staff; 
    for (int i = 0; i < names.size(); ++i) 
    { 
     // Ignore people on vacation. 
     if (!statuses[i]) 
     { 
      staff.emplace_back(names[i], tasks[i], projects[i]); 
     } 
    } 
    // Sort by availability 
    std::sort(staff.begin(), staff.end()); 
    // And we're done. 
    return staff[0].name; 
} 
+0

ありがとう。あなたは正しいです。 – user3051460

関連する問題