题目链接

大型补档计划

没想出来去看题解了。。。

关键是发现无论怎样括号嵌套,每个元素始终只有对答案的贡献为 + a[i] 或者 - a[i]。

而且第一个必然贡献是 +1, 第二个必然是 -1。

所以用背包跑出来每个元素应该加还是减。

然后就是构造了。

观察到每个减操作实际上是把一个位置的贡献取反,而且这个位置不能是第一个位置。

随便来一个贡献序列

1 -1 1 1 -1 -1 1 -1 1 1 -1

最后一步一定是 a[1] - a[2], 所以此时的 a[2] 里的正负性一定和我们求出来的相反,所以就可以把每个 1 都减掉(除了 a[1]),最后变成了这种形式:

1 -1 -1 -1 -1 -1

这时候用 a[1] 把后面都减掉,之前被减掉的别的 1 相当于取反了两次,贡献是对的。

#include <iostream>
#include <cstring>
using namespace std;
const int N = 101, S = 10005 * 2, P = 10000;
int n, t, a[N], f[N][S], ans[N];
int main() {
scanf("%d%d", &n, &t);
for (int i = 1; i <= n; i++) scanf("%d", a + i);
f[2][P + a[1] - a[2]] = -1;
for (int i = 3; i <= n; i++)
for (int j = 0; j < S; j++)
if (f[i - 1][j]) {
if(j + a[i] < S) f[i][j + a[i]] = 1;
if(j - a[i] >= 0 )f[i][j - a[i]] = -1;
}
int s = t + P;
for (int i = n; i > 1; i--) {
if((ans[i] = f[i][s]) == 1) s -= a[i];
else s += a[i];
}
int cnt = 0;
for (int i = 2; i <= n; i++) if (ans[i] == 1) printf("%d\n", i - (cnt++) - 1);
for (int i = n; i > 1; i--) if (ans[i] == -1) puts("1");
return 0;
}

AcWing 316 .减操作的更多相关文章

  1. C语言数组和指针的理解_在取地址运算上的操作_指针加减操作_a 和&a 的区别

    1.一个实例+理论分析 在了解数组和指针的访问方式前提下,下面再看这个例子: main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); pr ...

  2. ORACLE 日期加减操作

    无论是DATE还是timestamp都可以进行加减操作. 可以对当前日期加年.月.日.时.分.秒,操作不同的时间类型,有三种方法: 1 使用内置函数numtodsinterval增加小时,分钟和秒2 ...

  3. java日期加减操作

    1.用java.util.Calender来实现 Calendar calendar=Calendar.getInstance();      calendar.setTime(new Date()) ...

  4. 设计4个线程,其中2个对num进行加操作,另两个对num进行减操作

    /** * 设计4个线程,其中2个对num进行加操作,另两个对num进行减操作 */ public class ThreadTest { private int j; public static vo ...

  5. 类型:Oracle;问题:oracle 时间加减;结果:ORACLE 日期加减操作

    ORACLE 日期加减操作 无论是DATE还是timestamp都可以进行加减操作. 可以对当前日期加年.月.日.时.分.秒,操作不同的时间类型,有三种方法: 1 使用内置函数numtodsinter ...

  6. Flutter实战视频-移动电商-61.购物车_商品数量的加减操作

    61.购物车_商品数量的加减操作 provide/cart.dart pages/cart_page/cart_count.dart 先引入provide和cartProvide 定义接收一个item ...

  7. ORACLE 时间加减操作

    DATE和timestamp类型都可以进行加减操作.可以对当前日期加年.月.日.时.分.秒,操作不同的时间类型,有三种方法: 1 使用内置函数numtodsinterval增加小时,分钟和秒2 加一个 ...

  8. 【转载】 C#中日期类型DateTime的日期加减操作

    在C#开发过程中,DateTime数据类型用于表示日期类型,可以通过DateTime.Now获取当前服务器时间,同时日期也可以像数字一样进行加减操作,如AddDay方法可以对日期进行加减几天的操作,A ...

  9. POJ1722 算法竞赛进阶指南 SUBSTRACT减操作

    原题连接 题目描述 给定一个整数数组\(a_1,a_2,-,a_n\). 定义数组第 i 位上的减操作:把\(a_i\)和\(a_{i+1}\)换成\(a_i - a_{i+1}\). 用con(a, ...

随机推荐

  1. 查询Ceph的OSD占用内存

    前言 之前写过一篇关于查询OSD的运行的CPU的情况的分享,本篇是讲的获取内存占用的,代码包括两种输出,一种是直接的表格,一种是可以方便解析的json 代码 直接上代码,python才用不久,所以可能 ...

  2. LeetCode283移动零问题java高效解法

    一.题目: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序. 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 1.必须 ...

  3. 面试中AOP这样说,面试官只有一个字:服!

  4. IMX8移植cpufreq子系统

    一.简介         CPUFreq子系统位于 drivers/cpufreq目录下,负责进行运行过程中CPU频率和电压的动态调整,即DvFS( Dynamic Voltage Frequency ...

  5. 使用pdfFactory为PDF文件设定查看选项

    一般情况下,大部分PDF文件都会按照默认的查看设置,以100%的尺寸显示第一页的内容.但在一些特殊情况下,PDF文件的创建者会设定其他的文件查看尺寸,或设定打开页为第N页,来达到引起阅读者关注的目的. ...

  6. LeetCode周赛#209

    1609. 奇偶树 #广搜 #二叉树的层次遍历 题目链接 题意 如果一棵二叉树满足下述几个条件,则可以称为奇偶树 : 二叉树根节点所在层下标为 0 ,根的子节点所在层下标为 1 ,根的孙节点所在层下标 ...

  7. 【python】Matplotlib作图中有多个Y轴

    在作图过程中,需要绘制多个变量,但是每个变量的数量级不同,在一个坐标轴下作图导致曲线变化很难观察,这时就用到多个坐标轴.本文除了涉及多个坐标轴还包括Axisartist相关作图指令.做图中label为 ...

  8. 放进你的收藏夹吃灰!Linux 运维必备的 40 个命令总结

    1.删除0字节文件 find -type f -size 0 -exec rm -rf {} ; 2.查看进程 按内存从大到小排列 PS -e -o "%C : %p : %z : %a&q ...

  9. CountDownLatch、CyclicBarrier、Semaphore、Exchanger 的详细解析

    本文主要介绍和对比我们常用的几种并发工具类,主要涉及 CountDownLatch . CyclicBarrier . Semaphore . Exchanger 相关的内容,如果对多线程相关内容不熟 ...

  10. 2014.04.28基于CPLD的LCOS场序彩色视频控制器设计

    基于CPLD的LCOS场序彩色视频控制器设计 作者:宋丹娜,代永平,刘艳艳,商广辉 发表刊物:液晶与显示,2009 学习时间:2014.04.28 文章讲述了-- (和上一篇论文有些相似之处) 1. ...