有不同幾個選手玩飛鏢遊戲,比賽後每局比分的比分都不是按固定順序排列的,也就是說每個人的每局得分序列並不是一致的,是混亂的.現在要根據每個選手的得分序列來預測每個人的最大勝利數和最小勝利數。例子如下:
輸入:
3 3 (3個選手,3局比賽)
102 86 94 (第一個選手的成績)
98 73 112 (第二個)
95 84 125 (第三個)
輸出:
0 2 (第一個選手的最小勝利和最大勝利數)
0 2 (第二個)
1 2 (第三個)
下面是求最小勝利場數的算法:
對總的元素和各位選手的得分分別排序(從高到低)
對每一位選手來說,若他的第n個得分(前n-1個得分大於這個得分),在總序列中的位置小於2×n,則他的最少勝場加1,否則加0;
對該選手的每一個得分進行操作,就可以得出最少勝場數。
在本題目中,總的序列爲
125,112,102,98,95,94,86,84,75
對第三位選手來說,他的第一個得分125,在總序列中的位置爲1(<2*1),則最少勝場數加1;他的第二個得分95,在總序列中的位置
爲5(>2*2),則最少勝場數加0;他的第三個得分84,在總序列中的位置爲8(>3*2),最少勝場加0;故他最少能勝一場。
對其他選手也可以類推
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
int minwin(const vector<int>&a,vector<int> b)
{
int win=0;
size_t pos;
for (size_t j=0;j<a.size();j++)
{
vector<int>::iterator vite=find(b.begin(),b.end(),a[j]);
pos=vite-b.begin();
if((pos+1)<2*(j+1)&&pos>=0) win++;
}
return win;
}
int main()
{
int num_people,num_set;
vector<int>totalseq;
cin>>num_people;
cin>>num_set;
vector<vector<int> >data(num_people);
int score;
for (size_t i=0;i<num_people;i++){
for (size_t j=0;j<num_set;j++)
{
cin>>score;
data[i].push_back(score);
totalseq.push_back(score);
}
sort(data[i].begin(),data[i].end(),greater<int>());
}
sort(totalseq.begin(),totalseq.end(),greater<int>());
for (size_t i=0;i<num_people;i++)
{
cout<<minwin(data[i],totalseq)<<endl;
}
system("pause");
return 0;
}