首页 > 代码库 > CSDN挑战编程——《数学问题》

CSDN挑战编程——《数学问题》

数学问题

题目详情:

给你两个长度为n的正整数序列分别为{a1,a2,a3...an},{b1,b2,b3...bn},0<ai,bi<=100;

设S=max{x1*a1+x2*a2+x3*a3+...+xn*an,(1-x1)*b1+(1-x2)*b2+(1-x3)*b3+...+(1-xn)*bn},xi为整数,0<=xi<=1。

请你求出S的最小值。

输入描述:

输入包含多组测试数据,以文件结尾。每组测试数据包含三行行,第一行为一个正整数n(0<n<=100);第二行输入的是ai,第三行输入的是bi,每两个数以空格隔开。

输出描述:

对于每组测试数据输出相应的答案。



答题说明:

输入样例:

3

2 9 4

2 1 8

3

1 2 3

2 1 1

输出样例:

4

2


/*
	思路:
		a[],b[]数组中对应坐标位置的数据不同则取最小的那个(取到对应的count1,count2中去),
		相同的数据(存到c[]数组中)待后面动态规划分组。 
		
		动态规划的依据是,分两组的差值和 count1与count2的差值最接近然后求结果。 
*/ 
#include "stdio.h"
#include "stdlib.h"
#define maxn 100+10

int a[maxn],count1,b[maxn],count2,n;
int c[maxn],len;

inline double abs(double x)
{
	return x>0?x:-1*x;
}

int fun(int size)
{
	int index;
	double s1,tmp;
	int *buf=(int *)malloc(sizeof(int)*size);
	s1=(size-count2+count1)/2.0; 	//最佳分组中最小一组的和,去与s1最接近的值 
	buf[0]=0; index=1; tmp=buf[0];
	for(int i=1;i<=size;i++){
		buf[i]=0; buf[i]=buf[i-1];
		for(int j=0;j<len;j++){
			if(i-c[j]>=0 && buf[i]<c[j]+buf[i-c[j]]){
				buf[i]=c[j]+buf[i-c[j]];
			}
		}
		
		if(abs(s1-buf[i])<=abs(s1-tmp)){
			tmp=buf[i];
			index=i;
		}else{
			break;
		} 
	//	printf("%d ",buf[i]);
	}
	
	return (count2+buf[index])>(count1+size-buf[index])?(count2+buf[index]):(count1+size-buf[index]);
}

int main()
{

	while(scanf("%d",&n) && n>0)
	{
		int i,sum;
		for(i=0;i<n;i++){
			scanf("%d",&a[i]);
		}
		
		for(i=0,len=0,count1=0,count2=0,sum=0;i<n;i++){
			scanf("%d",&b[i]);
			if(a[i]<b[i]){
				count1+=a[i];
			}else if(a[i]>b[i]){
				count2+=b[i];
			}else{
				c[len++]=a[i];
				sum+=a[i];
			}
		}		
		
		if(count1>count2){
			int tmp=count2;	count2=count1; count1=tmp;
		}
		
		if(len>0){
			printf("%d\n",fun(sum));
		}else{
			printf("%d\n",count1>count2?count1:count2);
		}

	}	
} 
本人愚昧,代码不优,超时的说,拿出来衬托一下大神同时希望大神们给些改良意见,感谢


CSDN挑战编程交流群:372863405