籃球隊員組隊

注意:一個人雖然各個位置都很強,但是場上只能打一個位置。

分析:各列都排下序,把前面幾個不重複(人員、位置都不重疊)的高分球員對應值都加起來比較取大者即結果。

結論:手算、心算、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;
}

 

發佈了106 篇原創文章 · 獲贊 136 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章