zoukankan      html  css  js  c++  java
  • 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
    ",fun(sum));
    		}else{
    			printf("%d
    ",count1>count2?count1:count2);
    		}
    
    	}	
    } 
    
    本人愚昧。代码不优,超时的说,拿出来衬托一下大神同一时候希望大神们给些改良意见。感谢


    CSDN挑战编程交流群:372863405          



  • 相关阅读:
    在JavaWeb中使用Log4j步骤
    关于我为什么不再更新博客园了
    windows termial 配置文件
    windows10 命令行修复系统引导
    vscode修改code runner插件默认使用的编译器
    windows下vscode修复c++找不到头文件
    windows下安装mingw-w64
    vscode美化方法以及定制主题插件
    windows下隐藏磁盘分区
    2018 icpc 徐州网络赛 F Features Track
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5269593.html
Copyright © 2011-2022 走看看