1 条题解

  • 0
    @ 2025-4-7 21:19:28

    C :

    #include<stdio.h>
    #include<ctype.h>
    #include<string.h>
    #include<stdlib.h>
    
    int a[64];
    int t[1<<15];
    int n;
    char str[1024];
    
    int cmp(const void *a,const void *b) {
            return *(int *)a-*(int *)b;
    }
    
    int main() {
            int i,j,k,n1,n2,l,r,m,s,ret;
            char *p;
            while(gets(str)) {
                    for(i=0;str[i];i++) if (!isdigit(str[i]) && str[i]!=' ') break;
                    if (str[i]) {
                            puts("ERROR");
                            continue;
                    }
                    for(p=strtok(str," "),s=n=0;p;n++,p=strtok(NULL," ")) { 
                            sscanf(p,"%d",&a[n]);
                            s+=a[n];
                    }
    
                    n1=n-n/2,n2=n-n1,ret=s;
                    for(i=0;i<(1<<n1);i++) {
                            for(j=k=0;j<n1;j++) if (i&(1<<j)) k+=a[j];
                            t[i]=k;
                    }
                    qsort(t,m=1<<n1,sizeof(t[0]),cmp);
                    for(i=0;i<(1<<n2);i++) {
                            for(j=k=0;j<n2;j++) if (i&(1<<j)) k+=a[n1+j];
                            for(l=0,r=m;l<r;) {
                                    int tt=k+t[(l+r)/2];
                                    if (tt<s-tt) l=(l+r)/2+1; else r=(l+r)/2;
                            }
                            if (l<m && k+t[l]-(s-k-t[l])<ret) ret=k+t[l]-(s-k-t[l]);
                            if (l>0 && s-k-t[l-1]-k-t[l-1]<ret) ret=s-k-t[l-1]-k-t[l-1];
                    }
                    printf("%d %d\n",(s+ret)/2,(s-ret)/2);
            }
            return 0;
    }
    

    C++ :

    #include<stdio.h>
    #include<ctype.h>
    #include<string.h>
    #include<stdlib.h>
    
    int a[64];
    int t[1<<15];
    int n;
    char str[1024];
    
    int cmp(const void *a,const void *b) {
    	return *(int *)a-*(int *)b;
    }
    
    int main() {
    	int i,j,k,n1,n2,l,r,m,s,ret;
    	char *p;
    	while(gets(str)) {
    		for(i=0;str[i];i++) if (!isdigit(str[i]) && str[i]!=' ') break;
    		if (str[i]) {
    			puts("ERROR");
    			continue;
    		}
    		for(p=strtok(str," "),s=n=0;p;n++,p=strtok(NULL," ")) { 
    			sscanf(p,"%d",&a[n]);
    			s+=a[n];
    		}
    
    		n1=n-n/2,n2=n-n1,ret=s;
    		for(i=0;i<(1<<n1);i++) {
    			for(j=k=0;j<n1;j++) if (i&(1<<j)) k+=a[j];
    			t[i]=k;
    		}
    		qsort(t,m=1<<n1,sizeof(t[0]),cmp);
    		for(i=0;i<(1<<n2);i++) {
    			for(j=k=0;j<n2;j++) if (i&(1<<j)) k+=a[n1+j];
    			for(l=0,r=m;l<r;) {
    				int tt=k+t[(l+r)/2];
    				if (tt<s-tt) l=(l+r)/2+1; else r=(l+r)/2;
    			}
    			if (l<m && k+t[l]-(s-k-t[l])<ret) ret=k+t[l]-(s-k-t[l]);
    			if (l>0 && s-k-t[l-1]-k-t[l-1]<ret) ret=s-k-t[l-1]-k-t[l-1];
    		}
    		printf("%d %d\n",(s+ret)/2,(s-ret)/2);
    	}
    	return 0;
    }
    
    
    • 1

    信息

    ID
    1098
    时间
    1000ms
    内存
    32MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者