题意:给n个数,一开始基数为0,用这n个数依次对基数做加法或减法,使基数不超过k且不小于0,输出最远能运算到的数字个数,输出策略。

解法:dp。dp[i][j]表示做完第i个数字的运算后结果为j的可能性,可能为1,不可能为0,于是得到状态转移方程dp[i][j] = dp[i - 1][j - a[i]] | dp[i - 1][j + a[i]],当被转移的状态不在0~k之间时特判。dp时记录路径。

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long
using namespace std;
bool dp[1005][1005];
bool path[1005][1005];
int a[1005];
int main()
{int n, k;while(~scanf("%d%d", &n, &k)){for(int i = 1; i <= n; i++)scanf("%d", &a[i]);memset(dp, 0, sizeof dp);memset(path, 0, sizeof path);dp[0][0] = 1;int ans = 0;int pos = 0;for(int i = 1; i <= n; i++){for(int j = 0; j <= k; j++){if(j - a[i] < 0 && j + a[i] > k)continue;if(j - a[i] < 0){dp[i][j] = dp[i - 1][j + a[i]];path[i][j] = 0;}else if(j + a[i] > k){dp[i][j] = dp[i - 1][j - a[i]];path[i][j] = 1;}else{dp[i][j] = (dp[i - 1][j - a[i]] | dp[i - 1][j + a[i]]);if(dp[i - 1][j - a[i]])path[i][j] = 1;}if(dp[i][j]){ans = i;pos = j;}}if(ans != i)break;}printf("%d\n", ans);vector <bool> v;for(int i = ans; i > 0; i--){v.push_back(path[i][pos]);if(path[i][pos])pos -= a[i];elsepos += a[i];}int len = v.size();for(int i = len - 1; i >= 0; i--){if(v[i])printf("+");elseprintf("-");}puts("");}return 0;
}

  

转载于:https://www.cnblogs.com/Apro/p/4685436.html

CF GYM 100703G Game of numbers相关推荐

  1. CF Gym 100227 I题 题解

    这场Gym全名是这个:2013-2014 CT S01E01: Extended 2000 ACM-ICPC East Central North America Regional Contest ( ...

  2. 【CF#192 A】Funky Numbers (二分,查找,二元组)

    题干: As you very well know, this year's funkiest numbers are so called triangular numbers (that is, i ...

  3. Caravan Robbers CF Gym - 100134C

    https://cn.vjudge.net/problem/Gym-100134C http://codeforces.com/gym/100134/attachments 答案就是最小的min(bi ...

  4. CF Gym 100685A Ariel

    传送门 A. Ariel time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  5. CF Gym 100187E Two Labyrinths (迷宫问题)

    题意:问两个迷宫是否存在公共最短路. 题解:两个反向bfs建立层次图,一遍正向bfs寻找公共最短路 #include<cstdio> #include<cstring> #in ...

  6. CF Gym 101630 B Box

    题目的意思大概就是给一个长方体的长宽高,问他能不能用一个w*h的纸剪出来,就是说展开图的长宽能不能比给定的小. 题目给了11中展开图的拓扑结构,我觉得这个很关键,要是题目没有给这个我可能想不到那么全面 ...

  7. 【CF gym 103260】40th Petrozavodsk Programming Camp, Day 5,2021.2.3 水题2题

    M.Discrete Logarithm is a Joke 题意: 思路: 不难想到an=g^{an+1},因为样例给了 a[1000000]的值,所以反着推就行了. 记得开int128,longl ...

  8. 【题解】CF#403 D-Beautiful Pairs of Numbers

    这题还挺对胃口的哈哈~是喜欢的画风!回家路上一边听歌一边想到的解法,写出来记录一下-- 首先,由于 \(b_{k} < a_{k + 1}\) ,所以我们可以看作是在一个长度为 n 的序列上选择 ...

  9. cf Gym 101086M ACPC Headquarters : AASTMT (Stairway to Heaven)

    题目: Description standard input/output As most of you know, the Arab Academy for Science and Technolo ...

最新文章

  1. 陌陌一面,为什么SpringBoot的 jar 可以独立运行?
  2. fast软件_自媒体者遇见喜欢好听的视频背景音乐,用一款软件就可以把它提取...
  3. 08-面向对象----
  4. [Vue warn]: You are using the runtime-only build of Vue where the template compiler is not available
  5. Android开发手册 (Android的手工教程MtAndroid开发手册)
  6. Glide 4.x之生命周期与Activity的绑定原理详解
  7. 什么年代了,买硬盘不论T?
  8. CentOS6.7 Linux Squid 代理服务器安装配置
  9. 人体姿态估计-CPN(三)
  10. iPhoneX设计稿适配Android,三分钟弄懂iPhoneX设计尺寸和适配(二)
  11. 计网实验-1_Cisco Package Trace:Basic switch setup
  12. 煮一壶清茶,悟一种人生
  13. 如何在printf中输出,特殊字符(如:%、\、““)或表示八进制012、十六进制0xc
  14. 6-23 sdust-Java-可实现多种排序的Book类
  15. Nginx获取真实用户IP
  16. 1789. 牛为什么过马路 II
  17. Oracle11g数据库的下载与安装
  18. 全球光刻机龙头是怎样炼成的
  19. 给李开复:“创新工厂”最大的问题
  20. anaconda安装配置步骤、报错解决

热门文章

  1. Android ListView中 每一项都有不同的布局
  2. STL之涉及到的算法
  3. CentOS 6.5下源码包安装配置JDK 7
  4. 如何使用 WinUSB 与 USB 设备 (USBDevice) 通信
  5. python遵循什么协议_《Python网络爬虫》2.3 Robots协议的遵守方式
  6. java write 去bom_Java处理UTF-8带BOM的文本的读写
  7. 如何查看kafka每个话题一共分了几个分区_如何决定kafka集群中话题的分区的数量...
  8. java中两短行代码合并一行_帮忙啊!!!!找出两个Java文件相似程度超过某一%的代码行。...
  9. tiny服务器系列,项目:TinyHTTP服务器
  10. html5怎么在画布怎么旋转,javascript – 如何旋转HTML5画布的现有内容?