16计科程设考试压轴题 解题报告

【题目大意】有5个人,每人有10个粉丝,现在要从中选出K个人,记这K人拥有的粉丝数为N,求出一种选法使得(N-7*K)最大。

【输入】分五行,每行有十个数,代表粉丝的ID

【输出】选的人的编号(5个人分别以1,2,3,4,5编号)

【解题思路】关键是从这五个人中选出K个人的选法怎么表示,当然可以用5个for循环,但当人数更多时这种办法明显行不通了,这里我采取的是用二进制表示的办法:

例如二进制数10011,可以代表我们选择第1、2、5个人,那么令i从00000到11111就可以表示出所有的选择方案,所以用一个for循环就可以解决问题了。

但是根据某个具体的i,怎么从中获取具体选法的信息呢?可以用位运算的方法来实现。将i右移(j-1)位,再与1作按位与运算,就可以得知具体要不要选第j个人(例如i=10011,因为i>>1&1=1,所以在这种规则下要选第2个人。

这样一来,只用在每种情况下开个数组fanChoose记录这k个人的粉丝情况,再统计出粉丝总数,就可以很快计算出N-7*K的值了,下面附上具体代码

#include<stdio.h>
int main(){
	int i,j,k,max=-1,maxi,fans[5][10];
	for(i=0;i<5;i++)
		for(j=0;j<10;j++)
			scanf("%d",&fans[i][j]);
	for(i=0;i<32;i++){
		int K=0,N=0,fanChoose[210]={0};
		for(j=0;j<5;j++) 
			if(i>>j&1) for(k=0;k<10;k++)
				fanChoose[fans[j][k]]=1,K++;
		for(j=0;j<=200;j++)
			if(fanChoose[j]) N++;
		if(N-7*K>max){
			max=N-7*K;
			maxi=i;
		}
	}
	for(j=0;j<5;j++)
		if(maxi>>j&1) printf("%d ",j+1);
	printf("\n");
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值