40人を8チームに分けるプログラムが書けません。
制約条件として
・1~5の能力値(5が最大)の平準化
・なるべくチーム内の属性(9種類)が被らないようにする
)データ例
ID \ 能力値 \属性
1 \ 5 \ 1
よろしくお願いします。
チーム力が均等になるような班分け
Re: チーム力が均等になるような班分け
問題の定義に曖昧さがあるので、質問者様の望む回答が出来るかどうかは分かりませんが、、、
つまりは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++) チーム[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種類)が被らないようにする
属性が被らない事を優先するのなら、グラフ理論を使い、違う属性のメンバー同士を同じチームになり得るメンバーとして処理する工夫や、上記の例で言う「最弱チーム選出」を「チームに入っていない属性選出」みたいなものに改造したり、同じ属性のメンバーが入った場合に、その人数や能力値で重み付けする等の、工夫も必要になるかもしれません。
ここら辺は、質問者様の求める仕様に依って、ロジックが大幅に変わるのではないかと思います。
Re: チーム力が均等になるような班分け
白い変人さんありがとうございます。
優先順位としては平準化なので、この方向性でなんとかできそうです。
重ねて質問ですが、使用言語はC言語ということでよろしいでしょうか。
プログラミングを始めたばかりで、正直どの文字がどういう意味をしているのかわからないので、
申し訳ないのですが細かい単位での説明コメントを中学生にわかるようなレベルで教えて頂けると嬉しいです。
これからプログラミングを覚えていくためにもどうかお力添え願います。
優先順位としては平準化なので、この方向性でなんとかできそうです。
重ねて質問ですが、使用言語はC言語ということでよろしいでしょうか。
プログラミングを始めたばかりで、正直どの文字がどういう意味をしているのかわからないので、
申し訳ないのですが細かい単位での説明コメントを中学生にわかるようなレベルで教えて頂けると嬉しいです。
これからプログラミングを覚えていくためにもどうかお力添え願います。
Re: チーム力が均等になるような班分け
> プログラミングを始めたばかりで、正直どの文字がどういう意味をしているのかわからないので、
> 申し訳ないのですが細かい単位での説明コメントを中学生にわかるようなレベルで教えて頂けると嬉しいです。
> これからプログラミングを覚えていくためにもどうかお力添え願います。
いきなり複雑なプログラムは書けなくて当然です。
しかし、他人に丸投げするよりも、簡単なプログラムから自分で作っていきましょう。
まず、属性やチーム分けの事を一旦忘れて、5人の能力値を乱数で割り当て、
それをそのまま表示するプログラムを目指しましょう。
(本来は40人ですが、デバッグを簡単にするため5人で作りましょう)
これでもどうしたらいいか、全くわからないのでしたら、
C言語(もしかしたら別の言語?)の入門書をしっかり読んで理解しましょう。
> 重ねて質問ですが、使用言語はC言語ということでよろしいでしょうか。
それを決めるのはプログラムを作るあなたです。
白い変人さんの疑似コードもC言語を意識して作られていると思いますが、
雰囲気を伝えるためのものと考え、あなたが習得したい言語で作りましょう。
> 申し訳ないのですが細かい単位での説明コメントを中学生にわかるようなレベルで教えて頂けると嬉しいです。
> これからプログラミングを覚えていくためにもどうかお力添え願います。
いきなり複雑なプログラムは書けなくて当然です。
しかし、他人に丸投げするよりも、簡単なプログラムから自分で作っていきましょう。
まず、属性やチーム分けの事を一旦忘れて、5人の能力値を乱数で割り当て、
それをそのまま表示するプログラムを目指しましょう。
(本来は40人ですが、デバッグを簡単にするため5人で作りましょう)
これでもどうしたらいいか、全くわからないのでしたら、
C言語(もしかしたら別の言語?)の入門書をしっかり読んで理解しましょう。
> 重ねて質問ですが、使用言語はC言語ということでよろしいでしょうか。
それを決めるのはプログラムを作るあなたです。
白い変人さんの疑似コードもC言語を意識して作られていると思いますが、
雰囲気を伝えるためのものと考え、あなたが習得したい言語で作りましょう。
Re: チーム力が均等になるような班分け
うっかりしていたので、一応、訂正だけ。
誤:40人の能力を昇順にソートし、能力の低い人から、順にチームに割り振れば良いでしょう。
正:40人の能力を降順にソートし、能力の高い人から、順にチームに割り振れば良いでしょう。
誤:能力値の昇順に整列する処理 略
正:能力値の降順に整列する処理 略
言語の学習方法に関しては、たいちう氏の仰る通りに進めてみると良いと思います。
今、第一線で活躍しているプログラマも、最初は"HELLO WORLD!!"と表示させる事が出来た事に感動を覚えてから、全てが始まったのです。
誤:40人の能力を昇順にソートし、能力の低い人から、順にチームに割り振れば良いでしょう。
正:40人の能力を降順にソートし、能力の高い人から、順にチームに割り振れば良いでしょう。
誤:能力値の昇順に整列する処理 略
正:能力値の降順に整列する処理 略
言語の学習方法に関しては、たいちう氏の仰る通りに進めてみると良いと思います。
今、第一線で活躍しているプログラマも、最初は"HELLO WORLD!!"と表示させる事が出来た事に感動を覚えてから、全てが始まったのです。