一个飞盘问题

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值