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");
}

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_36326096/article/details/54022753
文章标签: C语言
个人分类: 程序设计基础
上一篇程序设计实验Ⅰ期末模拟 解题报告
下一篇期中模拟考试 题解
想对作者说点什么? 我来说一句

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

关闭
关闭
关闭