注意:一個人雖然各個位置都很強,但是場上只能打一個位置。
分析:各列都排下序,把前面幾個不重複(人員、位置都不重疊)的高分球員對應值都加起來比較取大者即結果。
結論:手算、心算、Excel算都比寫代碼快的樣子。。。
#include<bits/stdc++.h>
using namespace std;
const int MaxN=105; //最大測評用例數
int cmp(const pair<int, int>& x, const pair<int, int>& y)//自定義pair比較函數
{
return x.second > y.second;
}
int main() {
vector<pair<int,int> > vec1,vect2,vect3,vect4,vect5;
vector<pair<int,int> > vecs[5]={vec1,vect2,vect3,vect4,vect5};//5個vector用於存5列,key值都爲首列序號,value爲該列對應各元素評分值
//輸入數值
int teamScore[MaxN][MaxN];
for(int i=0;i<20;i++)
for(int j=0;j<6;j++)
cin>>teamScore[i][j];
for(int i=0;i<5;i++)
for(int j=0;j<20;j++){
vecs[i].push_back(make_pair(teamScore[j][0],teamScore[j][i+1]));//將輸入的數據對應5列丟入5個vector中
}
sort(vecs[0].begin(), vecs[0].end(), cmp);//對1號位評分值進行降序排序
sort(vecs[1].begin(), vecs[1].end(), cmp);//對2號位評分值進行降序排序
sort(vecs[2].begin(), vecs[2].end(), cmp);//對3號位評分值進行降序排序
sort(vecs[3].begin(), vecs[3].end(), cmp);//對4號位評分值進行降序排序
sort(vecs[4].begin(), vecs[4].end(), cmp);//對5號位評分值進行降序排序
//計算
int ans=0;//隊伍戰鬥值初始0
int positionList[5]={0,1,2,3,4};//假設籃球首發5個位置(控球后衛,得分後衛,小前鋒,大前鋒,中鋒)
do{//遍歷5個位置——全排列(不同人只能打一個不同的位置)
int p1=0,p2=0,p3=0,p4=0,p5=0;
while(1){//2號位人選同1號位重疊換2號位人選
if(vecs[positionList[0]][p1].first==vecs[positionList[1]][p2].first)
p2++;
else
break;
}
while(1){//3號位人選同1、2號位重疊換3號位人選
if(vecs[positionList[0]][p1].first==vecs[positionList[2]][p3].first||
vecs[positionList[1]][p2].first==vecs[positionList[2]][p3].first)
p3++;
else
break;
}
while(1){//4號位人選同1、2、3號位重疊換4號位人選
if(vecs[positionList[0]][p1].first==vecs[positionList[3]][p4].first||
vecs[positionList[1]][p2].first==vecs[positionList[3]][p4].first||
vecs[positionList[2]][p3].first==vecs[positionList[3]][p4].first)
p4++;
else
break;
}
while(1){//5號位人選同1、2、3、4號位重疊換4號位人選
if(vecs[positionList[0]][p1].first==vecs[positionList[4]][p5].first||
vecs[positionList[1]][p2].first==vecs[positionList[4]][p5].first||
vecs[positionList[2]][p3].first==vecs[positionList[4]][p5].first||
vecs[positionList[3]][p4].first==vecs[positionList[4]][p5].first)
p5++;
else
break;
}
ans=max(ans,vecs[positionList[0]][p1].second+//將當前不同位置與不同人選戰力值相加,結果取較大者
vecs[positionList[1]][p2].second+
vecs[positionList[2]][p3].second+
vecs[positionList[3]][p4].second+
vecs[positionList[4]][p5].second);
}while(next_permutation(positionList,positionList+5));//遍歷5個位置——全排列(不同人只能打一個不同的位置)
//結果
cout<<ans<<endl;
return 0;
}