#2
by 白い変人 » 7年前
問題の定義に曖昧さがあるので、質問者様の望む回答が出来るかどうかは分かりませんが、、、
つまりは1~5の能力の平準化を優先するのか、属性が被らない事を優先するのか、それともその使い分けの基準にも厳密な定義があるのかで、ロジックが違ってくるのかもしれないという事ですね。
>1~5の能力の平準化
に関しては、40人の能力を昇順にソートし、能力の低い人から、順にチームに割り振れば良いでしょう。
例
typedef struct TEAM{
char *ID;
int 能力値;
char *属性;
}TEAM;
void sort(int *メンバー){
・・・
能力値の昇順に整列する処理 略
・・・
}
TEAM* 最弱チーム選出(TEAM **チーム){
return 各チームの能力値の総和を比較し、最も能力が低いチームのアドレスを返却
}
void main(void){
int i,j;
TEAM チーム[8][33];
TEAM メンバー[40];
TEAM *work_team;
//メンバーのデータを入れる処理は略
for(i=0;i<8;i++) for(j=0;j<33;j++) チーム[j].ID=NULL;
sort(チーム);
for(i=0;i<40;i++){
work_team=最弱チーム選出(チーム);
for(j=0;work_team[j].ID!=NULL;j++);
work_team[j]=メンバー;
}
}
適当に書きましたが、ざっくりで言うと、こんな感じで平準化は実現可能かと。
>属性(9種類)が被らないようにする
属性が被らない事を優先するのなら、グラフ理論を使い、違う属性のメンバー同士を同じチームになり得るメンバーとして処理する工夫や、上記の例で言う「最弱チーム選出」を「チームに入っていない属性選出」みたいなものに改造したり、同じ属性のメンバーが入った場合に、その人数や能力値で重み付けする等の、工夫も必要になるかもしれません。
ここら辺は、質問者様の求める仕様に依って、ロジックが大幅に変わるのではないかと思います。
問題の定義に曖昧さがあるので、質問者様の望む回答が出来るかどうかは分かりませんが、、、
つまりは1~5の能力の平準化を優先するのか、属性が被らない事を優先するのか、それともその使い分けの基準にも厳密な定義があるのかで、ロジックが違ってくるのかもしれないという事ですね。
>1~5の能力の平準化
に関しては、40人の能力を昇順にソートし、能力の低い人から、順にチームに割り振れば良いでしょう。
例
typedef struct TEAM{
char *ID;
int 能力値;
char *属性;
}TEAM;
void sort(int *メンバー){
・・・
能力値の昇順に整列する処理 略
・・・
}
TEAM* 最弱チーム選出(TEAM **チーム){
return 各チームの能力値の総和を比較し、最も能力が低いチームのアドレスを返却
}
void main(void){
int i,j;
TEAM チーム[8][33];
TEAM メンバー[40];
TEAM *work_team;
//メンバーのデータを入れる処理は略
for(i=0;i<8;i++) for(j=0;j<33;j++) チーム[i][j].ID=NULL;
sort(チーム);
for(i=0;i<40;i++){
work_team=最弱チーム選出(チーム);
for(j=0;work_team[j].ID!=NULL;j++);
work_team[j]=メンバー[i];
}
}
適当に書きましたが、ざっくりで言うと、こんな感じで平準化は実現可能かと。
>属性(9種類)が被らないようにする
属性が被らない事を優先するのなら、グラフ理論を使い、違う属性のメンバー同士を同じチームになり得るメンバーとして処理する工夫や、上記の例で言う「最弱チーム選出」を「チームに入っていない属性選出」みたいなものに改造したり、同じ属性のメンバーが入った場合に、その人数や能力値で重み付けする等の、工夫も必要になるかもしれません。
ここら辺は、質問者様の求める仕様に依って、ロジックが大幅に変わるのではないかと思います。