注册 登录
编程论坛 C语言论坛

蓝桥杯青少中级组题目

nucc 发布于 2022-01-23 07:08, 2226 次点击
题目:小蓝有几箱口罩,现在要平均分配给两个医院,第一行输入一共的箱数,第二行输入每一箱的口罩数量,输出平均分配后的结果,如两个数据大小不同,则按照从大到小输出。
输入:3 200 300 110;
输出:310 300
我的代码是这样的,感觉并不是很好,并且测试不是完全通过。
程序代码:

#include<iostream>
#include <algorithm>
using namespace std;
int jue(int a){
    if(a<0){
        return -a;
    }
    else{
        return a;
    }
}
bool cmp(int a, int b){
    return a>b;
}
int main(){
    int n=0,a[10],sum_k=0,sum[100000],temp=0,temp_lop=1;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
        sum_k=sum_k+a[i];
    }
    int summ=sum_k;
    sum_k=sum_k/2;
    for(int i=0;i<n;i++){
        sum[temp]=a[i];
        temp++;
        for(int j=i+1;j<n;j++){
            sum[temp]=a[i]+a[j];
            temp++;
            for(int p=j+1;p<n;p++){
                sum[temp]=a[i]+a[j]+a[p];
                //cout<<"here";
                temp++;
            }
        }
    }
    //cout<<temp;
    int minnum=jue(sum_k-sum[0]),ans=sum_k-sum[0];
    for(int i=1;i<temp;i++){
        if(jue(sum_k-sum[i])<minnum){
            minnum=jue(sum_k-sum[i]);
            ans=sum_k-sum[i];
        }
    }
    int ans_ar[2];
    ans_ar[0]=sum_k+ans;
    ans_ar[1]=summ-sum_k-ans;
    sort(ans_ar,ans_ar+2,cmp);
    //cout<<sum_k+ans<<" "<<summ-sum_k-ans<<endl;
    cout<<ans_ar[0]<<" "<<ans_ar[1]<<endl;
}
5 回复
#2
xianfajushi2022-01-23 11:00
哪个用例数据无法通过?列出多组数据来看看。
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2022-1-23 16:28编辑过]

#3
diycai2022-01-24 12:49
程序代码:
#include <stdio.h>
#define MAX_NUM        25
int main()
{
    int i, j, k, n, a[MAX_NUM], sum, half, value, ret;
    scanf("%d", &n);
    for (i=sum=0; i<n; i++)
    {
        scanf("%d", &a[i]);
        sum += a[i];
    }
    half = sum >> 1;
    ret = 0;
    for (i=0; i<(1<<n); i++)
    {
        j = i;
        value = 0;
        k = 0;
        while (j)
        {
            if (j & 1)
            {
                value += a[k];
                if (value >= half)
                {
                    break;
                }
            }
            k++;
            j >>= 1;
        }
        if (value == half)
        {
            ret = half;
            break;
        }
        if (value < half)
        {
            if (value > ret)
            {
                ret = value;
            }
        }
    }
    printf("%d %d\n", sum-ret, ret);

    return 0;
}

没优化,将就用吧。
#4
纯蓝之刃2022-01-24 15:59
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void)
{
    //每箱个数列表,总方案数,差值,最小差值时的方案号
    unsigned int num,i,*array,count,diff,diff_count;
    unsigned int sum,sum_l;
    unsigned int temp,temp_count,remainder,temp_diff;

//    printf("请输入箱数");
//    if(scanf("%u",&num)!=1)
//        return 0;
    num=3;

    array=calloc(num,sizeof(unsigned int));
//    for(i=0;i<num;i++)
//    {
//        printf("请输入第%u箱个数:");
//        scanf("%u",array+i);
//    }
    *(array+0)=200;
    *(array+1)=300;
    *(array+2)=110;

    for(i=0,count=1,sum=0; i<num; i++)
    {
        count*=2;           //总类型
        sum+=*(array+i);    //总数
    }

    diff=sum;           //初始化差值
    diff_count=0;
    count=(count+1)/2;
    for(i=0; i<count; i++)      //总方案
    {
        temp=i;
        temp_count=0;
        sum_l=0;
        while(1)                //每个方案
        {
            remainder=temp%2;   //
            temp=temp/2;        //
            if(temp==0 && remainder==0)
            {
                temp_diff=abs(sum-sum_l-sum_l);
                if(temp_diff<diff)
                {
//                    printf("index=%u,last=%u,now=%u\n",i,diff,temp_diff);
                    diff_count=i;
                    diff=temp_diff;
                }
                break;
            }
            if(remainder == 1)
            {
                sum_l=sum_l+*(array+temp_count);
            }
            temp_count++;
        }
    }

    temp=diff_count;
    temp_count=0;
    sum_l=0;
    sum=0;      //借用变量
    while(temp_count<num)
    {
        remainder=temp%2;   //
        temp=temp/2;        //
        if(remainder == 1)
        {
            sum_l+=*(array+temp_count);
        }
        else
        {
            sum+=*(array+temp_count);
        }
        temp_count++;
    }
    if(sum>sum_l)
        printf("%u %u",sum,sum_l);
    else
        printf("%u %u",sum_l,sum);
}
#5
jklqwe1112022-01-25 00:41
程序代码:

#include <stdio.h>
#include <stdlib.h>

 
int  *nums ,n ,sum=0 ,sm=0 , flg=0;
  
int main(int argc,char* argv[])
{   
   void dfs(int cur ,int stm );  

   scanf("%d",&n);
   nums=(int*)malloc(sizeof(int)*n);  
   
   for(int i=0; i<n ;++i)
   {
     scanf("%d",nums+i);
     sum+=*(nums+i) ;
   }
   
   dfs(0 ,0);
   
   printf("\n"  );
   if(sum-sm>sm)printf("%d %d" ,sum-sm ,sm);     
   else printf("%d %d" ,sm,sum-sm );
     
   return 0 ;
}
void dfs(int cur ,int stm)
{
         
    if( flg || (cur==n ))return ;
   
    int tmp=stm+nums[cur];
    if(abs(sum-2*tmp)<abs(sum-2*sm))sm=stm+nums[cur];
   
    if(sum-tmp==tmp)
    {        
        flg=1;
        return ;
    }
    if(sum-tmp>tmp)
    {
               
        dfs( cur +1 ,tmp);
    }   
        
        dfs( cur +1 ,stm);
   
}



[此贴子已经被作者于2022-1-25 09:36编辑过]

#6
风卷浪起2022-01-26 18:57
你们是怎么把程序代码复制过来的?
1