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

题解:P12207 [蓝桥杯 2023 国 Python B] 划分

链接

题目描述

给定 40 个数,请将其任意划分成两组,每组至少一个元素。每组的权值为组内所有元素的和。划分的权值为两组权值的乘积。请问对于以下 40 个数,划分的权值最大为多少。

5160 9191 6410 4657 7492 1531 8854 1253 4520 92311266 4801 3484 4323 5070 1789 2744 5959 9426 44334404 5291 2470 8533 7608 2935 8922 5273 8364 88197374 8077 5336 8495 5602 6553 3548 5267 9150 3309

输入格式

输出格式

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只需要编写一个程序输出这个整数,输出多余的内容将无法得分。

输入输出样例

思路

首先注意到有 40 个数,并且只划分成两个部分。

然后发现是背包DP。别问我怎么知道的

可以想到一个 O(全部数之和×40÷2) 的方法(绝对不会TLE),其具体实现是先枚举 40 个数,然后再用背包DP可以生成哪些和,最后再求出这个和×(总和−这个和)就可以了。

代码

#include<bits/stdc++.h>
using namespace std;
int a[41]={-1e9,5160,9191,6410,4657,7492,1531,8854,1253,4520,9231,
1266,4801,3484,4323,5070,1789,2744,5959,9426,4433,
4404,5291,2470,8533,7608,2935,8922,5273,8364,8819,
7374,8077,5336,8495,5602,6553,3548,5267,9150,3309},sum,lbj[10000010],num;
long long maxx;
signed main(){ios::sync_with_stdio(0);for(int i=1;i<=40;i++){sum+=a[i];//最大的和就是全部的总和 } bool dp[sum+1];for(int i=1;i<=sum;i++){dp[i]=0;} dp[0]=1;//初始化,啥都不加就是0 for(int i=1;i<=40;i++){for(int j=sum/2;j>=a[i];j--){//枚举到一半即可,因为肯定是一小一大/一半一半 if(dp[j-a[i]]&&!dp[j]){//新的可能值 lbj[++num]=j;dp[j]=1; }}}for(int i=1;i<=num;i++)maxx=max(maxx,1LL*lbj[i]*(sum-lbj[i]));//maxx是long long类型,后面要用1LL乘,因为答案>max intcout<<maxx;
}

其实直接打完表输出就得了,直接输出12873625444

ChatGPT的题解

题目分析
给定40个正整数,划分成两组(均非空),记两组和为X和S−X,划分价值为X·(S−X)。由于f(X)=X·(S−X)是关于X的对称二次函数,在X=S/2处达到最大,因此只需在所有可实现的子集和中,选取最接近S/2的X即可。

解题思路

  1. 计算总和S;

  2. 用位运算优化的01背包(bitset):维护长度为S+1的dpdp[i]=1表示存在子集和为i;

  3. 初始dp[0]=1,对每个数v做 dp|=dp<<v

  4. 从⌊S/2⌋向下扫描,找到第一个dp[x]=1的x,即为最优;

  5. 答案即为1LLx(S−x)。

代码

#include<bits/stdc++.h>
using namespace std;
int main(){int a[40]={5160,9191,6410,4657,7492,1531,8854,1253,4520,9231,1266,4801,3484,4323,5070,1789,2744,5959,9426,4433,4404,5291,2470,8533,7608,2935,8922,5273,8364,8819,7374,8077,5336,8495,5602,6553,3548,5267,9150,3309};int S=0;for(int i=0;i<40;i++)S+=a[i];bitset<226925>dp;dp[0]=1;for(int i=0;i<40;i++)dp|=dp<<a[i];for(int x=S/2;x>=1;x--){if(dp[x]){long long ans=1LL*x*(S-x);cout<<ans;break;}}return 0;
}

复杂度分析

  • 时间:O(N·S/word_size)≈40×226924/64≈142000次位运算

  • 空间:O(S)≈2.3×10<sup>5</sup>位,约30 KB,完全可行。

http://www.dtcms.com/a/193319.html

相关文章:

  • 贝叶斯优化Transformer融合支持向量机多变量回归预测,附相关性气泡图、散点密度图,Matlab实现
  • 深入探索向量数据库:构建智能应用的新基础
  • vue3搭建脚手架前的前置知识
  • psycopg_pool.PoolTimeout: couldn‘t get a connection after 120.00 sec异常
  • 技术文档:变频器干扰问题与解决方案
  • 使用 QGIS 插件 OpenTopography DEM Downloader 下载高程数据(申请key教程)
  • 压电陶瓷极化-佰力博与您探讨极化工艺的重要性及极化方法。
  • Open CASCADE学习|容器及其使用
  • 2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(省赛)解题报告 | 珂学家
  • Zabbix Agent的区别与选择!
  • 鸿蒙OSUniApp制作自定义的下拉菜单组件(鸿蒙系统适配版)#三方框架 #Uniapp
  • 阿里巴巴 1688 数据接口开发指南:构建自动化商品详情采集系统
  • 【RabbitMQ】实现RPC通信的完整指南
  • MySQL——1、数据库基础
  • 25.5.15
  • homeassistant安装
  • 社区电商场景的 社群推广与维护系统化分析框架
  • MySQL如何查看某个表所占空间大小?(表空间大小查看方法)
  • 《教育退费那些事儿:从困境到破局》
  • 中国版 Cursor?腾讯推出 AI 编程助手 CodeBuddy,重新定义编程体验
  • 硅基计划2.0 学习总结 贰
  • 软件工程之软件产品的环境
  • 在文件检索方面doris和elasticsearch的区别
  • 最新版VSCode通过SSH远程连接Ubuntu 16.04等旧版Linux的方法
  • 中国近代史3
  • 阿里开源通义万相 Wan2.1-VACE,开启视频创作新时代
  • 【工具】metaTP:一种集成了自动化工作流程的元转录组数据分析工具包
  • git 本地提交后修改注释
  • YOLO11解决方案之距离计算探索
  • NVIDIA Omniverse 现已支持中文!