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

P10960 SUBSTRACT 个人题解

题目传送门

题目大意:

给定一个数组 \(a\) ,可以选择一个下标 \(i\) ,使 \(a[i]=a[i]-a[i+1]\) 并删去 \(a[i+1]\) ,使得数组最后剩下的数为 \(t\) ,输出每次操作的 \(i\)

解题方法:

我们把题目给出的这种操作命名为减操作,可以发现对于最终答案 \(t\) ,我们可以转化成这样 \(t=a[1]−a[2]±a[3]±······±a[n]\) 的形式。可以发现 \(a[1]\) 必须是 \(+\) 号, \(a[2]\) 必须是 \(-\) 号,首先我们来看 \(a[1]\) 必须是 \(+\) 号:因为减操作是前面一个数减去后面一个数,而 \(a[1]\) 前面没有数,所以他一定不会被减去,即一定是 \(+\) 号,因此最后一次减操作一定是对 \(i=1\) 进行的;而 \(a[2]\) 必须是 \(-\) 号是因为最后一次减操作一定是对 \(i=1\) 进行的,那 \(a[2]\) 一定是最后被减去的,所以一定是 \(-\) 号。

举一个 \(n=5\) 的例子(即样例):
原数组: \(a[1]~~a[2]~~a[3]~~a[4]~~a[5]\)
\(i=2\) 进行减操作: \(a[1]~~a[2]-a[3]~~a[4]~~a[5]\)
\(i=3\) 进行减操作:\(a[1]~~a[2]−a[3]~~a[4]−a[5]\)
\(i=2\) 进行减操作:\(a[1]~~a[2]−a[3]-(a[4]−a[5])\)
\(i=1\) 进行减操作:\(a[1]-(a[2]−a[3]-(a[4]−a[5]))\)
则处理完的数组为:\(a[1]−a[2]+a[3]+a[4]−a[5]\)

那么题目就被我们转换成给定一个数组,把数组中几个数变成其相反数,使最后加和成为 \(t\),那么就可以做了,我们用 \(f[i][j]\) 表示前 \(i\) 个数和为 \(j\) 时第 \(i\) 个数的符号( \(1\)\(-1\)),由于 C++ 的负号好像挂了,我们给每个数加上 \(10000\) ,保证下标为正数。

那么怎么反推出每一次的减操作呢?其实我也不会(),但是根据其他大佬的题解以及个人理解,我们可以发现除了 \(a[1]\)\(a[2]\) 以外
对于一个数,前面不是正号,就是负号,即\(\begin{cases}a[i]−a[i+1]\\a[i−1]−a[i]\end{cases}\)
说明只有当第 \(i-1\) 位进行减操作的时候,这个第 \(i\) 位才可以是负号,同理当第 \(i\) 位进行减操作的时候,这个第 \(i\) 位才可以是正号,那么我们可以每次找到正号的位置输出,不过记得要减去 \(cnt-1\)\(cnt\) 代表进行了几次减操作)。

注意到 \(1\le n \le100,1\le|T|\le10^4\),所以时间复杂度为 \(O(n|T|)\) ,在 \(10^6\) 级别内可以通过。

本题代码:

#include<bits/stdc++.h>
using namespace std;
const int N=105,M=10005,MAXN=20086;
inline int read(){int x=0,f=1;char c=getchar();while(c<'0' || c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0' && c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}//快读 
int low=10000;//给每个数加上low以保证下标为正数 
int n=read(),t=read(),f[N][MAXN],a[N],ans[N],s,cnt;
int main(){for(int i=1;i<=n;i++)a[i]=read();f[1][a[1]+low]=1;//a[1]只能为正 f[2][a[1]-a[2]+low]=-1;//a[2]只能为负 for(int i=3;i<=n;i++){for(int j=-10000+low;j<=10000+low;j++){if(f[i-1][j]){f[i][j-a[i]]=-1;f[i][j+a[i]]=1;}}}s=t+low;for(int i=n;i>=2;i--){//回溯减操作过程 ans[i]=f[i][s];if(ans[i]==1)s-=a[i];else if(ans[i]==-1)s+=a[i];}for(int i=2;i<=n;i++){//寻找正号位置输出 if(ans[i]==1){printf("%d\n",i-cnt-1);cnt++;	//减操作数+1 }}for(int i=2;i<=n;i++)//把负号输出 if(ans[i]==-1)puts("1");return 0;
}
http://www.zskr.cn/news/19058.html

相关文章:

  • 2025新型千斤顶厂家推荐:柳州市联桥科技,品质卓越服务到位
  • 2025年PP鱼池优质厂家推荐:超众渔业机械,环保耐用首选!
  • 完整教程:MongoDB Ops Manager部署
  • 2025医疗器械微弧氧化优质厂家推荐,华源漆业技术领先服务到
  • 【网络协议】SSL与TLS的关系 - 教程
  • 2025年安全光栅厂家最新推荐榜:精准防护与高效性能的工业首
  • 2025七水硫酸锌实力厂家推荐:安通环保科技,品质卓越信赖之
  • 2025磁力泵厂家最新推荐榜:高效稳定与优质服务的首选指南
  • 2025智能防爆灯厂家最新推荐榜:安全高效与技术创新典范
  • 2025氢氧化镁供应厂家推荐:辽宁润辉新材料科技优质厂家首选
  • 2025黄金回收品牌最新推荐榜:高信誉与专业服务的首选厂家!
  • 「Java EE制作指南」用MyEclipse创建的EJB开发工具(一)
  • 中考_学科
  • 工具篇-Cursor中接入DeepSeek,只要这三步
  • 实用指南:告别“硬件绑定”困局:青云云易捷如何让异构服务器“物尽其用”
  • 求职信 - MKT
  • java项目CPU爆高问题排查方案
  • 2025方钢供应厂家推荐:山东鑫泽金属制品优质选择!
  • 2025年中国行业内领先的GEO(AI搜索优化)厂家权威推荐榜单:四川云视GEO当首
  • 2025 屋顶防水维修/外墙防水维修/电梯井防水维修厂家推荐榜:专注全场景渗漏解决方案供应!
  • 2025 流化床/GMP标准/实验室气流粉碎机厂家推荐榜:聚焦多行业粉碎需求,赋能高效生产!
  • 【EBS】EBS系统新克隆环境的MRP无法运行
  • FirstOrDefault
  • elementPlus tabel实现复制粘贴功能
  • 基于微信小工具高仿背单词消除游戏
  • python fast api websocket 连接事例
  • 贴牛皮纸铝卷生产商推荐/铝卷生产厂家/铝卷哪家好
  • 2025浇注型聚氨酯厂家口碑排行榜:品质与服务双优之选
  • 【Vue】LangChain4j大模型对话-前端页面完成(vite+vue3+router)
  • 距离和