Spring Outing 微软2016校园招聘在线笔试第二场

相比较于前两题,这题应该算是小有难度。

其实不是难在思维多么复杂,也不是算法要多高明,主要难在读题。

一开始我以为只要宏观考虑,简单的说如果有数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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值