当前位置: 首页 > article >正文

18. 分积木

题目    分积木
难度    难
题目说明    Solo和koko是两兄弟,妈妈给了他们一大堆积木,每块积木上都有自己的重量。现在他们想要将这些积木分成两堆。哥哥Solo负责分配,弟弟koko要求两个人获得的积木总重量“相等”(根据Koko的逻辑),个数可以不同,不然就会哭,但koko只会先将两个数转成二进制再进行加法,而且总会忘记进位(每个进位都忘记)。如当25(11001)加11(1011)时,koko得到的计算结果是18(10010):
   11001
+ 01011
-------------   
   10010
Solo想要尽可能使自己得到的积木总重量最大,且不让koko哭。
输入描述    3
3 5 6
第一行是一个整数N( 2≤ N ≤100 ),表示有多少块积木;第二行为空格分开的N个整数Ci(1 ≤ Ci ≤),表示第i块积木的重量。
输出描述    11
让koko不哭,输出Solo所能获得积木的最大总重量;否则输出“-1”。
补充说明    如果能让koko不哭,输出Solo所能获得的积木的总重量,否则输出-1。
该样例输出为 11 。
解释:Solo 能获得重量为 5 和 6 的两块积木,5 转换成二进制是 101, 6 的二进制是 110,按照 kolo 的计算方法(忘记进位),结果为 3(二进制 011)。kolo 获得重量为 3 的积木,而 solo 获得重量为 11(十进制,5 + 6)的积木。
------------------------------------------------------
示例    
示例1 
   
输入    3
输出    3 5 6
说明    11
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/ZiJinShi/article/details/132872529

一、问题分析

首先读题,仔细看描述中的内容,发现需求是

1.Solo和Koko分积木,每个积木有自己的重量

2.Solo负责分配,koko希望两人获得的积木总重量“相等”

3.但是koko的算法不好,只会将两个数字转换成二进制再进行加法

4.并且koko一定会忘记进位。如25(11001)和11(1011)时,koko得到的计算结果是18

5.Solo希望自己得到的积木总重量最大,且不让koko哭

6.输入描述:第一行是一个整数N(n大于等于2小于等于100),表示有多少块积木;

第二行为空格分开的N个整数Ci(Ci大于等于1小于等于10的6次方),表示第i块积木的重量

7.输出描述:让koko不哭,solo能获得的最大总重量,否则输出“-1”

二、解题思路

1.弟弟实际上只会做异或运算我们可以使用"^"作异或运算

2.这个问题需要最后两个人获得的积木的总重量相等(对koko而言)

3.因为koko只会做异或运算,所以实际上最后solo的玩具的总重量异或koko的玩具的总重量等于0

4.也就是说只有所有玩具异或在一起的结果为0的情况下我们才认为此题有解

5.可是这样想想,那么直接所有的玩具都分配给solo不就完了么?(因为异或在一起结果是0)

6.所以证明弟弟至少要有一个玩具

7.所以只要我们先验证所有的玩具异或在一起的值为0

8.然后再将实际重量最小的分给koko(计算重量较大的n-1块积木重量的和就是答案)

(不知道我对题目的理解是否正确)

三、具体步骤

使用的语言是C

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

int main() {
    int N;
    scanf("%d", &N);
    int weight[N];
    int totalsolo = 0;
    int totalkoko = 0;
    int min = INT_MAX;
    for(int i = 0; i < N; i++) {
        scanf("%d", &weight[i]);
        if(weight[i] < min) {
            if(min != INT_MAX) totalsolo += min;
            min = weight[i];
        } else {
            totalsolo += weight[i];
        }
        totalkoko ^= weight[i];
    }
    if(totalkoko == 0) {
        printf("%d\n", totalsolo);
    } else printf("-1\n");
    return 0;
}


http://www.kler.cn/a/450401.html

相关文章:

  • 【从零开始入门unity游戏开发之——unity篇02】unity6基础入门——软件下载安装、Unity Hub配置、安装unity编辑器、许可证管理
  • sqoop的参数有哪些?
  • 算法day_3数组中的单一元素和二进制位颠倒
  • docker 部署win系统
  • jsp | servlet | spring forEach读取不了对象List
  • Android使用PorterDuffXfermode模式PorterDuff.Mode.SRC_OUT橡皮擦实现“刮刮乐”效果,Kotlin(2)
  • C#—内建接口: IEnumerable与IEnumerator接口详解
  • 如何高效运营OZON:从基础搭建到运营策略
  • 【聊天室后端服务器开发】 入口网关开发
  • Hadoop组成概述
  • 循环和迭代
  • 合同尾款产生纠纷该如何处理
  • 京东科技基于 Apache SeaTunnel 复杂场景适配 #数据集成
  • 深度分析 es multi_match 中most_fields、best_fields、cross_fields区别
  • 用于管理Unity中UGUI的工具系统UISystem
  • Bootstrap 5 加载效果
  • python学opencv读取图像(十四)BGR图像和HSV图像通道拆分
  • Vision Pro开发实现系统UI风格 毛玻璃效果
  • |-牛式-|
  • WebRTC学习二:WebRTC音视频数据采集
  • ChatGPT与Postman协作完成接口测试(二)
  • 1 SpringBoot——项目搭建
  • Web 第一次作业 初探html 使用VSCode工具开发
  • 后端-redis
  • Git远程仓库的使用
  • 【唐叔学算法】第21天:超越比较-计数排序、桶排序与基数排序的Java实践及性能剖析