16 条题解

  • 46
    @ 2023-7-23 13:57:10

    跟L9-4-8一毛一样

    只是多了这玩意:


    for(int i=1;i<=4;i++)
    

    定义改一下: int n, s[5], a[21], ans, t[5];


    所以 代码长这样:

    #include <bits/stdc++.h>
    using namespace std;
    int n, s[5], a[21], ans, t[5];
    int main()
    {
        for (int i = 1; i <= 4; i++)
        {
            cin >> s[i];
            t[i] = 1000000;
        }
        for (int i = 1; i <= 4; i++)
        {
            for (int j = 1; j <= s[i]; j++)
                cin >> a[j];
            for (int j = 0; j < (1 << s[i]); j++)
            {
                int sum1 = 0, sum2 = 0;
                for (int k = 0; k < s[i]; k++)
                {
                    if (j & (1 << k))
                        sum1 += a[k + 1];
                    else
                        sum2 += a[k + 1];
                }
                t[i] = min(t[i], max(sum1, sum2));
            }
            ans += t[i];
        }
        cout << ans;
        return 0;
    }
    

    我怕你说没证据AC: 所以截了屏: image


    制作不易,点赞拿走

    • 26
      @ 2023-4-5 14:13:32

      滴~已查收题解!

      #include <iostream>
      using namespace std;
      int n, s[5], a[21], ans, t[5];
      int main()
      {
          for (int i = 1; i <= 4; i++)
          {
              cin >> s[i];
              t[i] = 1000000;
          }
          for (int i = 1; i <= 4; i++)
          {
              for (int j = 1; j <= s[i]; j++)
                  cin >> a[j];
              for (int j = 0; j < (1 << s[i]); j++)
              {
                  int sum1 = 0, sum2 = 0;
                  for (int k = 0; k < s[i]; k++)
                  {
                      if (j & (1 << k))
                          sum1 += a[k + 1];
                      else
                          sum2 += a[k + 1];
                  }
                  t[i] = min(t[i], max(sum1, sum2));
              }
              ans += t[i];
          }
          cout << ans;
          return 0;
      }
      

      ···以上来自@ 非原创···

    • 7
      @ 2023-2-28 15:02:46

      本题相当于把课内的练习8重复做4次。 对每个习题集枚举子集,在子集里和不在子集里的题目,分别分配给两个大脑,计算出两个大脑的时间sum1和sum2,取最大值,即为当前习题集的时间。 4个习题集的时间求总和,即为最终答案。

      代码
      #include <iostream>
      using namespace std;
      int n, s[5], a[21], ans, t[5];
      int main()
      {
          for (int i = 1; i <= 4; i++)
          {
              cin >> s[i];
              t[i] = 1000000;
          }
          for (int i = 1; i <= 4; i++)
          {
              for (int j = 1; j <= s[i]; j++)
                  cin >> a[j];
              for (int j = 0; j < (1 << s[i]); j++)
              {
                  int sum1 = 0, sum2 = 0;
                  for (int k = 0; k < s[i]; k++)
                  {
                      if (j & (1 << k))
                          sum1 += a[k + 1];
                      else
                          sum2 += a[k + 1];
                  }
                  t[i] = min(t[i], max(sum1, sum2));
              }
              ans += t[i];
          }
          cout << ans;
          return 0;
      }
      


      • 6
        @ 2023-7-27 21:01:58

        P1015

        -题目回顾-

        这次期末考试,禾木需要考 4 科。因此要开始刷习题集,每科都有一个习题集,分别有 s1,s2,s3,s4道题目,完成每道题目需要一些时间,可能不等

        禾木有一个能力,他的左右两个大脑可以同时计算 2 道不同的题目,但是仅限于同一科。因此,禾木必须一科一科的复习。

        禾木希望尽快把事情做完,所以他希望知道能够完成复习的最短时间。


        -分析-

        这道题就是L9-5-8 * 4版本,所以说不过多讲解,不懂的话可以回看一下^_^


        -代码-

        #include <bits/stdc++.h>
        using namespace std;
        int s[10], s1, s2, a[25], sum, ans, x;
        int main()//by AGOMG
        {
            for(int i = 1; i <= 4; i++)
                cin >> s[i];
            for(x = 1; x <= 4; x++)
            {
                for (int i = 1; i <= s[x]; i++)
                {
                    cin >> a[i];
                }
                ans = 1e9;
                for (int i = 0; i < (1 << s[x]); i++)
                {
                    int s1 = 0, s2 = 0;
                    for(int j = 0; j < s[x]; j++)
                    {
                        if(i & (1 << j))
                        {
                            s1 += a[j + 1];
                        }
                        else
                        {
                            s2 += a[j + 1];
                        }
                    }
                    ans = min(ans, max(s1, s2));
                }
                sum += ans;
            }
            cout << sum;
            return 0;
        }
        
        • 5
          @ 2023-6-10 21:35:20

          其实就是一个子集枚举循环四次,每次均取和的最小值,相加即为结果

          可以把这一整个问题拆分成四科分步

          不多说直接上代码

          #include<iostream>
          using namespace std;
          int a[5][20],s[5],summ[5];
          int review(int x){
              int mini=summ[x];
              int t=0;
              for(int i=1;i<(1<<s[x]);i++){
                  t=0;
                  for(int j=0;j<s[x];j++)if(i&(1<<j))t+=a[x][j];
                  if(summ[x]-t>t)t=summ[x]-t;
                  if(t<mini)mini=t;
                  if(mini*2==summ[x])return mini;
              }
              return mini;
          }
          
          int main(){
              int mini=0;
              for(int i=1;i<=4;i++){
                  cin>>s[i];
              }
              for(int i=1;i<=4;i++)for(int j=0;j<s[i];j++){
                  cin>>a[i][j];
                  summ[i]+=a[i][j];
              }
              for(int i=1;i<=4;i++)mini+=review(i);
              cout<<mini;
              return 0;
          }
          

          其中,review(int x)是对第x门科目的枚举,各门科目均取最小值(同时只能复习一课),相加得到mini即为结果

          • 2
            @ 2023-7-26 22:33:54
            #include <iostream>
            using namespace std;
            int n, s[5], a[21], ans, t[5];
            int main()
            {
                for (int i = 1; i <= 4; i++)
                {
                    cin >> s[i];
                    t[i] = 1000000;
                }
                for (int i = 1; i <= 4; i++)
                {
                    for (int j = 1; j <= s[i]; j++)
                        cin >> a[j];
                    for (int j = 0; j < (1 << s[i]); j++)
                    {
                        int sum1 = 0, sum2 = 0;
                        for (int k = 0; k < s[i]; k++)
                        {
                            if (j & (1 << k))
                                sum1 += a[k + 1];
                            else
                                sum2 += a[k + 1];
                        }
                        t[i] = min(t[i], max(sum1, sum2));
                    }
                    ans += t[i];
                }
                cout << ans;
                return 0;
            }// hetao1415825
            
            • 1
              @ 2024-3-9 17:16:25
              #include <iostream>
              using namespace std;
              int n, s[5], a[21], ans, t[5];
              int main()
              {
                  for (int i = 1; i <= 4; i++)
                  {
                      cin >> s[i];
                      t[i] = 1000000;
                  }
                  for (int i = 1; i <= 4; i++)
                  {
                      for (int j = 1; j <= s[i]; j++)
                          cin >> a[j];
                      for (int j = 0; j < (1 << s[i]); j++)
                      {
                          int sum1 = 0, sum2 = 0;
                          for (int k = 0; k < s[i]; k++)
                          {
                              if (j & (1 << k))
                                  sum1 += a[k + 1];
                              else
                                  sum2 += a[k + 1];
                          }
                          t[i] = min(t[i], max(sum1, sum2));
                      }
                      ans += t[i];
                  }
                  cout << ans;
                  return 0;
              }
              
              • 1
                @ 2023-4-2 9:19:49
                #include <bits/stdc++.h>
                using namespace std;
                int ans, s[5], t[5], a[25];
                
                int main()
                {
                    
                    for ( int i = 1; i <= 4; i ++ ){
                        cin >> s[i];
                        t[i] = 10000000;
                    }
                    for ( int i = 1; i <= 4; i ++ )
                    {
                        for ( int j = 1; j <= s[i]; j ++ ) cin >> a[j];
                        for ( int j = 0; j < ( 1 << j ); j ++ )
                        {
                            int sum1 = 0, sum2 = 0;
                            for ( int k = 0; k < s[i]; k ++ )
                            {
                                if ( j & ( 1 << k ) )
                                    sum1 += a[k + 1];
                                else sum2 += a[k + 1];
                            }
                            t[i] = min( t[i], max( sum1, sum2 ) );
                        }
                        ans += t[i];
                    }
                    cout << ans << endl;
                    system("pause");
                    return 0;
                }
                

                有没有好同学帮我看看这个代码哪里有问题呀?debug找不出来,样例也过了,但是全WA

                • @ 2023-4-2 12:11:33

                  找到了,

                          for ( int j = 0; j < ( 1 << j ); j ++ )
                  

                  这里应为:

                  for (int j = 0; j < (1 << s[i]);j++)
                  

                  你试一下。


              • 0
                @ 2024-1-6 17:34:55
                #include <iostream>
                using namespace std;
                int n, s[5], a[21], ans, t[5];
                int main()
                {
                    for (int i = 1; i <= 4; i++)
                    {
                        cin >> s[i];
                        t[i] = 1000000;
                    }
                    for (int i = 1; i <= 4; i++)
                    {
                        for (int j = 1; j <= s[i]; j++)
                            cin >> a[j];
                        for (int j = 0; j < (1 << s[i]); j++)
                        {
                            int sum1 = 0, sum2 = 0;
                            for (int k = 0; k < s[i]; k++)
                            {
                                if (j & (1 << k))
                                    sum1 += a[k + 1];
                                else
                                    sum2 += a[k + 1];
                            }
                            t[i] = min(t[i], max(sum1, sum2));
                        }
                        ans += t[i];
                    }
                    cout << ans;
                    return 0;
                }
                
                • -1
                  @ 2024-6-9 11:34:39

                  自己想 #include <iostream> using namespace std; int main() { cout <<"你个sb👎 ,还来复制题解👎 " }

                  • -1
                    @ 2024-4-13 16:26:33

                    #include <bits/stdc++.h> using namespace std; int n, s[5], a[21], ans, t[5]; int main() { for (int i = 1; i <= 4; i++) { cin >> s[i]; t[i] = 1000000; } for (int i = 1; i <= 4; i++) { for (int j = 1; j <= s[i]; j++) cin >> a[j]; for (int j = 0; j < (1 << s[i]); j++) { int sum1 = 0, sum2 = 0; for (int k = 0; k < s[i]; k++) { if (j & (1 << k)) sum1 += a[k + 1]; else sum2 += a[k + 1]; } t[i] = min(t[i], max(sum1, sum2)); } ans += t[i]; } cout << ans; return 0; }

                    • -1
                      @ 2024-2-29 22:32:30

                      备模版即可

                      //by hetao6640877
                      #include <bits/stdc++.h>
                      using namespace std;
                      int s[5];//存放四个数字
                      int a[25],ans;
                      int main(){
                      	for (int i=1;i<=4;i++)cin>>s[i];
                      	for (int i=1;i<=4;i++){
                      		int MAX=0x3f3f3f3f;
                      		for (int j=1;j<=s[i];j++)cin>>a[j];
                      		for (int j=0;j<(1<<s[i]);j++){
                      			int sum1=0,sum2=0;
                      			for (int k=0;k<s[i];k++){
                      				if (j&(1<<k))sum1+=a[k+1];
                      				else sum2+=a[k+1]; 
                      			}
                      			MAX=min(MAX,max(sum1,sum2));
                      		}
                      		ans+=MAX;
                      	}
                      	cout<<ans;
                      	return 0;
                      }
                      
                      • -1
                        @ 2023-7-26 20:21:38
                        #include <bits/stdc++.h>
                        using namespace std;
                        int cal(int n)
                        {
                            int a[21],sum1=0,sum2=0,ans=1<<30;
                            for (int i=1;i<=n;i++)
                                cin>>a[i];
                            for (int i=1;i<(1<<n);i++)//子集枚举
                            {
                                sum1=0,sum2=0;
                                for (int j=0;j<n;j++)
                                {
                                    if (i&(1<<j))//在子集里的到一个大脑,不在的到另一个
                                        sum1+=a[j+1];
                                    else
                                        sum2+=a[j+1];
                                }
                                ans=min(ans,max(sum1,sum2));
                            }
                            return ans;
                        }
                        int s1,s2,s3,s4,ans;
                        int main()
                        {
                            cin>>s1>>s2>>s3>>s4;
                            cout<<cal(s1)+cal(s2)+cal(s3)+cal(s4);
                        }
                        
                        • -4
                          @ 2023-8-8 22:13:36
                          #include <bits/stdc++.h>
                          using namespace std;
                          int main(){
                              int s[5],a[21],ans=0,tmp,sum1,sum2;
                              cin>>s[1]>>s[2]>>s[3]>>s[4];
                              for(int i=1;i<=4;i++){
                                  for(int j=1;j<=s[i];j++)cin>>a[j];
                                  tmp=9999999;
                                  for(int j=0;j<(1<<s[i]);j++){
                                      sum1=0,sum2=0;
                                      for(int k=0;k<s[i];k++)j&(1<<k)?sum1+=a[k+1]:sum2+=a[k+1];
                                      tmp=min(tmp,max(sum1,sum2));
                                  }
                                  ans+=tmp;
                              }
                              cout<<ans<<endl;
                              return 0;
                          }
                          
                          • -12
                            @ 2023-4-1 16:31:54

                            禾木真厉害( ̄∇ ̄)

                          • -12
                            @ 2023-3-31 19:31:59

                            禾木真厉害( ̄∇ ̄)

                          • 1

                          信息

                          ID
                          53
                          时间
                          1000ms
                          内存
                          256MiB
                          难度
                          3
                          标签
                          递交数
                          2160
                          已通过
                          1087
                          上传者