标题:蓝桥杯青少中级组题目
只看楼主
nucc
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2022-1-23
结帖率:0
已结贴  问题点数:20 回复次数:5 
蓝桥杯青少中级组题目
题目:小蓝有几箱口罩,现在要平均分配给两个医院,第一行输入一共的箱数,第二行输入每一箱的口罩数量,输出平均分配后的结果,如两个数据大小不同,则按照从大到小输出。
输入: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;
}
搜索更多相关主题的帖子: int sum cout temp for 
2022-01-23 07:08
xianfajushi
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:527
专家分:690
注 册:2007-9-8
得分:4 
哪个用例数据无法通过?列出多组数据来看看。


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

2022-01-23 11:00
diycai
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:147
专家分:895
注 册:2021-5-18
得分:4 
程序代码:
#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;
}

没优化,将就用吧。
2022-01-24 12:49
纯蓝之刃
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:76
帖 子:554
专家分:3690
注 册:2019-7-29
得分:4 
程序代码:
#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);
}

一沙一世界,一花一天堂。无限掌中置,刹那成永恒。
2022-01-24 15:59
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:335
专家分:1125
注 册:2014-4-13
得分:4 
程序代码:
#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编辑过]

2022-01-25 00:41
风卷浪起
Rank: 3Rank: 3
来 自:中国福建福州福清
等 级:论坛游侠
威 望:4
帖 子:125
专家分:129
注 册:2021-11-13
得分:4 
你们是怎么把程序代码复制过来的?

追阳少年也会身披万丈光芒。
2022-01-26 18:57



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-508218-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.240884 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved