百度之星--第二场--T3度度熊的礼物

/*
	思路:用preValF[]记录各个人对礼品1的兴趣值,用preValS[]记录各个人对礼品2的兴趣值,
	用dec[][1]记录preValF[]-preValS[]的差值,用decN记录dec[][1]中大于0的个数
	用dec[][0]记录位置0,1,2,3......。当我们队dec[][1]进行从大到小排序时,dec[][0]的序号也一起跟着dec[][1]
	变化。
	礼品1个数记为N1,礼品2个数记为N2,人数记为N
	当decN>=N1时,我们从礼品1中拿出N1件,给谁呢,给已经按从大到小排好的dec[][1]对应的dec[][0]的前N1个坐标对应的值
	比如,N1=3,现在dec[][0]中从前到后选N1个,即选出dec[0][0]、dec[1][0]、dec[2][0],其值就是要将礼物1送给的对象。
	当decN<N1,则将礼品1送给dec[][0]前decN为对应的对象,礼品2则送给剩下的对象

  */

#include <stdio.h>
int main()
{

	int n=0;
	int num[1000][2];
	int present[2][3];
	scanf("%d",&n);
	int i1=0;
	//输入朋友喜爱特性
	for(i1=0;i1<n;i1++)
	{
		scanf("%d %d",&num[i1][0],&num[i1][1]);
	}
	int i2=0;
	//输入礼品特性
	for(i2=0;i2<2;i2++)
	{
		scanf("%d %d %d",&present[i2][0],&present[i2][1],&present[i2][2]);
	}
	
	//各个朋友对礼品1的兴趣值
	int preValF[1000];
	int i3=0;
	for(i3=0;i3<n;i3++)
	{
		preValF[i3]=num[i3][0]*present[0][1]+num[i3][1]*present[0][2];
	}
	//各个朋友对礼品2的兴趣值
	int preValS[1000];
	int i4=0;
	for(i4=0;i4<n;i4++)
	{
		preValS[i4]=num[i4][0]*present[1][1]+num[i4][1]*present[1][2];
	}

	//记录preValF-preValS的差dec,并记录差值正整数个数decN
	int dec[1000][2]={0};
	int i5=0;
	int decN=0;
	for(i5=0;i5<n;i5++)
	{
		dec[i5][0]=i5; 
		dec[i5][1]=preValF[i5]-preValS[i5];
		if(dec[i5][1]>=0)
			decN++;

	}

	//采用冒泡排序对dec
	int j1=0;
	int i6=0;
	int temp1=0;
	int temp2=0;
	for(j1=0;j1<n;j1++)
	{
		for(i6=1;i6< n-j1;i6++)
		{
			if( dec[i6-1][1]<dec[i6][1] )
			{  
				//dec[][0]代表是排在第几位,dec[][1]代表差值的值,我们让dec[][1]从大到小排序,dec[][0]和dec[][1]一起移动,
				//当dec[][1]按大到小排好后,dec[][0]则标记了其是第几个差值
				temp1=dec[i6-1][0];
				dec[i6-1][0]=dec[i6][0];
				dec[i6][0]=temp1;

				temp2=dec[i6-1][1];
				dec[i6-1][1]=dec[i6][1];
				dec[i6][1]=temp2;

			}
		}

	}

	//格局人数n、礼品1个数present[0][0],礼品2个数present[1][0],礼品1的值-礼品2的值整数的个数decN
	//来确定礼品1应该选哪几个
	int sum=0;
	if(decN>=present[0][0])//则礼品1中拿出来present[0][0]个,即全部拿出来
	{
		int i7=0;
		for(i7=0;i7<n;i7++)
		{
			int sig1=0;
			int j2=0;
			for(j2=0;j2<present[0][0];j2++)
			{
				if(i7==dec[j2][0])
					sig1=1;
			}
			if(sig1==1)
				sum=sum+preValF[i7];
			else
				sum=sum+preValS[i7];
		}
	}
	//如果decN<present[0][0],则从礼品1中取出decN个
	if(decN<present[0][0])
	{
		int i8=0;
		for(i8=0;i8<n;i8++)
		{
			int sig2=0;
			int j3=0;
			for(j3=0;j3<decN;j3++)
			{
				if(i8==dec[j3][0])
					sig2=1;
				
			}
			if(sig2==1)
				sum=sum+preValF[i8];
			else
				sum=sum+preValS[i8];
		}
	
	
	}
	
	printf("%d\n",sum);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值