有不同几个选手玩飞镖游戏,比赛后每局比分的比分都不是按固定顺序排列的,也就是说每个人的每局得分序列并不是一致的,是混乱的.现在要根据每个选手的得分序列来预测每个人的最大胜利数和最小胜利数。例子如下:
输入:
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;
}