浙大pat | 浙大pat 牛客网PAT顶级(Top Level)练习题 1003 博弈论

You class are planning for a spring outing. N people are votingfor a

destination out of K candidate places.

 The voting progress isbelow:

 First the class vote forthe first candidate place. If more than half

of the class agreed on the place, the place is selected. Thevoting ends.

 Otherwise they vote forthe second candidate place. If more than half

of the class agreed on the place, the place is selected. Thevoting ends.

 Otherwise they vote forthe third candidate place in the same way and

go on.

 If no place is selectedat last there will be no spring outing and

everybody stays at home.

 Before the voting, theChief Entertainment Officer did a survey, found

out every one's preference which can be represented as apermutation of

0, 1, ... K. (0 is for staying at home.) For example, when K=3,

preference "1, 0, 2, 3" means that the first place ishis

first choice, staying at home is the second choice, the secondplace is

the third choice and the third place is the last choice.

 The Chief EntertainmentOfficer sends the survey results to the class.

So everybody knows the others' preferences. Everybody wants hismore

prefered place to be selected. And they are very smart, theyalways

choose the optimal strategy in the voting progress to achievehis goal.

 Can you predict whichplace will be selected?



输入描述:

The first line contains two integers, N and K, the number ofpeople in your class and the number of candidate places.
The next N lines each contain a permutation of 0~K, representing someone'spreference.
For 40% of the data, 1 <= N, K <= 10
For 100% of the data, 1 <= N, K <= 1000




输出描述:

Output the selected place. Or "otaku" without quotesif no place is selected.

In the sample case, if the second peoson vote against the first place, no placewould be selected finally because the first person must vote against the secondplace for his own interest. Considering staying at home is a worse choice thanthe first place, the second person's optimal strategy is voting for the firstplace. So the first place will be selected



输入例子:

2 2
1 0 2
2 1 0



输出例子:

1

这是一道博弈论方面的题目,不知道叫做什么博弈,姑且叫他阶段博弈吧。

这种博弈的特征就是每一个都按照自己最大优势的方式来选择,并且每一个人都按照这种最大优势的方式来选择,每一个人都知道其他人会按照这种方式选择,因此之后的所有可能都是可以预测的,每个人的选择方式的内容是当所有人都按照最大优势选择的时候,这个人选择所有预测结果中最好的一种,

说起来有点绕口,假如没有相关经验,我觉得是很难做出来的,这种博弈的特点就是从后往前推,最后一步的情况是可以预测的,选择投票的必然是最后一个地点比家里蹲的优先级要高,选择投反对票的必然是家里蹲的优先级比最后一个点的要高,然后可以得到倒数第二步的结果,这样一直往前推,就能够得到第一步到最后一步的结果,就能够知道哪个地点最终被选中

这一题比较坑的地方就是题目中并没有说有多少组数据,这个时候一般是默认题目中有一组数据,但是这样就出错了,这一题实际上是不停输入,直到遇到EOF,所以以后在做这样的题目的时候注意一下

 

#include<iostream>

#include<vector>

#include<unordered_map>

using namespacestd;

 

int main()

{

      //0 2 4 5 3 1

 

      int N, K,tmp;

      while (cin >> N >> K)

      {

            vector<unordered_map<int,int>> theLike(N);

            for (int i = 0; i < N; i++)

            {

                  for (int j = 0; j < K + 1;j++)

                  {

                       cin >> tmp;

                       theLike[i][tmp] = j;

                  }

            }

            int theWinNum = 0;

            for (int i = K; i >= 1; i--)

            {

                  int count = 0;

                  for (int j = 0; j < N; j++)

                  {

                       if (theLike[j][i] <theLike[j][theWinNum])count++;

                  }

                  if (count > N / 2)

                  {

                       theWinNum = i;

                  }

            }

            if (theWinNum > 0)

                  cout <<theWinNum<<endl;

            else

                  cout <<"otaku"<<endl;

      }

      return 0;

}

阅读更多

没有更多推荐了,返回首页