列表

详情


OR87. 分石头

描述

已知石头重量数组。将石头分为质量最接近的两组

输入描述

数组,值为每个石头的质量

输出描述

两组的质量(降序排序)

示例1

输入:

5,1,1,1,1,1

输出:

5,5

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 368KB, 提交时间: 2019-05-05

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int min(int m,int q)
{
	if(m<=q)
		return m;
	else
		return q;

}

int max(int m,int q)
{
	if(m>=q)
		return m;
	else
		return q;

}





int main()
{
	int n;
	
	int*x;	
	int i,j;
	x=(int*)malloc(sizeof(int*)*100000);

	for(i=0;scanf("%d,",&x[i])!=EOF;i++)
	{
	}
	n=i;

	int t;
	for(i=0;i<n-1;i++)
	{	
		for(j=i;j<n;j++)
	
		{
			if(x[i]<x[j])
			{
				t=x[i];
				x[i]=x[j];
				x[j]=t;
			}
		}
	}
	/*
	for(i=0;i<n;i++)
	{
		printf("%d\t",x[i]);
	}

*/



	int r=0;	int l=0;
	int j1,j2;
	int least=x[0];
	int a,b;
	if(n==1)
	{
		printf("%d,%d\n",x[0],0);

	}
	else{
	for(i=1;i<n;i++)
	{
		r=0,l=0;
		for(j1=0;j1<i;j1++)
		{
			r+=x[j1];
	
		}
		for(j2=i;j2<n;j2++)
		{
			l+=x[j2];
	
		}
		//printf("———————————r l———————%d,%d\n",r,l);


		if(least>abs(r-l))
		{
			least=abs(r-l);
			a=min(r,l);
			b=max(r,l);

		}
	//	printf("———————————a b———————%d,%d\n",a,b);
	}

	printf("%d,%d\n",b,a);
	}
	return 0;
}

C++ 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2020-10-31

#include<bits/stdc++.h>
 
using namespace std;
 
int a[100000];
 
int main(){
 
    int k,n = 1;
 
    a[0] = 0;
    while(scanf("%d",&k) != EOF){
 
        a[n] = a[n - 1] + k;
 
        char c = getchar();
 
         
        if(c == '\n')
            break;
        n ++;
    }
 
 
 
    int l = 1,r = n;
    int mid;
 
    while(l + 1< r){
 
        mid = (l + r) >> 1;
 
        //cout<<"l = " << l << " r = "<< r << " mid = " <<mid<<endl;
 
        if(a[n] - a[mid] > a[mid] ){
            l = mid;
        }else{
            r = mid;
        }
    }
 
    //cout<<"a[n]  = "<<a[n] << " a[l] =  " << a[l] << endl;
 
    if(a[n] - a[l] > a[l])
        printf("%d,%d\n",a[n] - a[l],a[l]);
    else
        printf("%d,%d\n",a[l],a[n] - a[l]);
 
 
 
 
 
    return 0;
}

上一题