相比较于前两题,这题应该算是小有难度。
其实不是难在思维多么复杂,也不是算法要多高明,主要难在读题。
一开始我以为只要宏观考虑,简单的说如果有数i,j(i尽可能小,i越小表示喜好程度越高)使得至少有超出一半的人对于j的喜好小于i,结果wa了。。。
后来仔细研究了一下说明,换了一个思路。
如果1-k这些地点都不选,则最后必定是在家。
对于地点k,如果玩家i对于k的喜好程度更高(相较于在家),那么他就会在选择k的时候支持。若这样的i超过半数,则现在的默认地点就变为k
当然,如果小于半数,默认地点不变
然后就依次向前面扫
下面就是贴代码喽
#include <iostream>
#include <cstring>
using namespace std;
int choose[1005][1005],n,k,half;
bool useful(int least,int now)
{
int i,coun;
coun=0;
for(i=1;i<=n;i++)
if(choose[i][now]<choose[i][least])
coun++;
if(coun>=half)
return true;
return false;
}
int main()
{
// freopen("aa.txt","r",stdin);
int i,j,ans,q;
cin>>n>>k;
for(i=1;i<=n;i++)
for(j=1;j<=k+1;j++) {
scanf("%d",&q);
choose[i][q]=j; //第i个人对于第q个地方的喜好程度,值越小越喜欢
}
half=n/2+1;
ans=0;
for(i=k;i>=1;i--)
if(useful(ans,i))
ans=i;
if(ans==0)
cout<<"otaku"<<endl;
else
cout<<ans<<endl;
}