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