C. Divide by Three DP
http://codeforces.com/contest/792/problem/C
这题奇葩题我居然用dp过了。
如果要模拟的话,可以用一个栈保存,保存每一个%3 = 2的pos,%3 = 1的pos,注意到题目是最多删除2个数,就能使得整个数%3=0了,如果要删除前导0的话就另外算。
那么贪心从栈顶删除,也就是先删除后面的数就行。然后需要删除2,又分两种情况,删除两个1和删除一个2。。等等,一路模拟。
比赛的时候没想到这样,也觉得很复杂,于是就dp了,虽然TLE了,但是加了一个剪枝就过了,dfs很玄
我用dp[i][j]表示,前i位中,模3后余数是j的最大合法长度,最大合法长度,也就是不能含有前导0.所以1001这样的情况求出来是无解的,需要特判一下。
那么求到了这个长度之后
题目就变成了,给出n个数字,选出k个,使得组合起来得数字%3 = 0,不能含有前导0.
我想不到好的算法,就dfs暴力了。感觉应该会超时,但是剪了剪支居然46ms
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <assert.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <bitset>
const int maxn = 1e5 + ;
char str[maxn];
int dp[maxn][], lenstr; //dp出答案
vector<char>ans;
bool dfs(int cur, int now, int len, int pre) {
if (now == && len == dp[lenstr][]) return true;
if (cur == lenstr + ) return false;
if (len >= dp[lenstr][]) return false;
if (lenstr - cur + + len < dp[lenstr][]) return false;
if (str[cur] == '') {
if (pre) {
if (dfs(cur + , now, len + , )) {
ans.push_back(str[cur]);
return true;
}
return dfs(cur + , now, len, pre);
} else {
return dfs(cur + , now, len, pre);
}
} else {
if (dfs(cur + , (now + str[cur] - '') % , len + , )) {
ans.push_back(str[cur]);
return true;
}
return dfs(cur + , now, len, pre);
}
}
void work() {
scanf("%s", str + );
lenstr = strlen(str + );
memset(dp, -0x3f, sizeof dp);
dp[][] = ;
int flag = inf;
for (int i = ; i <= lenstr; ++i) {
if ((str[i] - '') % == ) flag = i;
for (int j = ; j < && i > ; ++j) {
dp[i][j] = dp[i - ][j];
}
//不是0的,自己作为一个
if (str[i] != '') dp[i][(str[i] - '') % ] = max(dp[i][(str[i] - '') % ], );
for (int j = ; j < ; ++j) {
int res = (j * + str[i] - '') % ;
dp[i][res] = max(dp[i][res], dp[i - ][j] + );
}
}
// cout << dp[lenstr][0] << endl;
if (dp[lenstr][] < && flag == inf) {
cout << - << endl;
return;
}
if (dp[lenstr][] < && flag != inf) {
cout << str[flag];
return;
}
dfs(, , , );
reverse(ans.begin(), ans.end());
for (int i = ; i < ans.size(); ++i) {
cout << ans[i];
}
}
int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
work();
return ;
}
C. Divide by Three DP的更多相关文章
- HDU 4301 Divide Chocolate (DP + 递推)
Divide Chocolate Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- CodeForces - 792C Divide by Three (DP做法)
C. Divide by Three time limit per test: 1 second memory limit per test: 256 megabytes input: standar ...
- Educational Codeforces Round 18 C. Divide by Three DP
C. Divide by Three A positive integer number n is written on a blackboard. It consists of not more ...
- HDU 4301 Divide Chocolate(DP)
http://acm.hdu.edu.cn/showproblem.php?pid=4301 题意: 有一块n*2大小的巧克力,现在某人要将这巧克力分成k个部分,每个部分大小随意,问有多少种分法. 思 ...
- XVII Open Cup named after E.V. Pankratiev. GP of SPb
A. Array Factory 将下标按前缀和排序,然后双指针,维护最大的右边界即可. #include<cstdio> #include<algorithm> using ...
- UOJ276 [清华集训2016] 汽水 【二分答案】【点分治】【树状数组】
题目分析: 这种乱七八糟的题目一看就是点分治,答案有单调性,所以还可以二分答案. 我们每次二分的时候考虑答案会不会大于等于某个值,注意到系数$k$是无意义的,因为我们可以通过转化使得$k=0$. 合并 ...
- LOJ6502. 「雅礼集训 2018 Day4」Divide(构造+dp)
题目链接 https://loj.ac/problem/6502 题解 中间一档部分分提示我们将所有的 \(w_i\) 排序. 考虑如果我们能构造出这样一个 \(w_i\) 的序列,使得该序列满足:对 ...
- 【概率dp】Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) D. Jon and Orbs
直接暴力dp就行……f(i,j)表示前i天集齐j种类的可能性.不超过10000天就能满足要求. #include<cstdio> using namespace std; #define ...
- poj3417 LCA + 树形dp
Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4478 Accepted: 1292 Descripti ...
随机推荐
- zabbix常用命令
1. 查看mysql 各数据库大小命令 "Database Size in MB" FROM information_schema.TABLES GROUP BY table_sc ...
- ffmpeg入门基础知识
获取ffmpeg源代码 如果你是在Windows环境下,则可以先装SVN的一个客户端TortoiseSVN(非常好用,强烈推荐),他安装完成后会集成在右键菜单中,点Checkout菜单,在弹出的界面中 ...
- Mongodb GridFS——适合大小超过16MB的文件
一.概述 GridFS是基于mongodb存储引擎是实现的“分布式文件系统”,底层基于mongodb存储机制,和其他本地文件系统相比,它具备大数据存储的多个优点.GridFS适合存储超过16MB的大型 ...
- Grunt 自动编译 Less 文件配置
1.安装Grunt http://www.gruntjs.net/getting-started 2.编辑 package.json 文件 { "name": "Grun ...
- Codeforces Round #535(div 3) 简要题解
Problem A. Two distinct points [题解] 显然 , 当l1不等于r2时 , (l1 , r2)是一组解 否则 , (l1 , l2)是一组合法的解 时间复杂度 : O(1 ...
- Azure Key Vault (3) 在Azure Windows VM里使用Key Vaule
<Windows Azure Platform 系列文章目录> 本章我们介绍如何在Azure Windows VM里面,使用.NET使用Azure Key Vault 我们需要对Key V ...
- vue全局配置
Vue.config 是一个对象,包含Vue的全局配置.可以在启动应用之前修改下列的属性: Vue.config.slient=true; 取消Vue所有的日志与警告 默认值false ...
- RTC驱动程序分析
drivers\rtc\rtc-s3c.c s3c_rtc_init platform_driver_register s3c_rtc_probe ...
- Union All ,Merge,Merge join 区别
本文转自:http://www.cnblogs.com/gudujianxiao/archive/2012/07/17/2594709.html SSIS Data Flow 中有几个组件可以实现不同 ...
- Android调试之TraceView
TraceView 在应用运行时,可以使用Debug类打开操作日志记录功能,打开后Android会详细记录应用花在每个线程以及线程的每个函数的调用时间.操作日志记录完毕后,可以使用Android SD ...