codeforces 792CDivide by Three(两种方法:模拟、动态规划
传送门:https://codeforces.com/problemset/problem/792/C
题意:给你一个字符串,要求让你删除最少个数的元素,使得最终答案是没有前导0并且是3的倍数。
题解:模拟:既然是3的倍数,那么第一步肯定是将每个都模上3,讨论长度为1的特殊情况,然后,我们讨论数字模上 3后的和sum
如果sum为0 直接输出,
如果sum为1,我们就要删去一个mod3为1的数或者两个mod3为2的数
如果sum为2,我们就要删去一个mod3为2的数或者两个mod3为1的数
代码如下:
#include<bits/stdc++.h>
using namespace std;
char s[];
int a[];
int t,flag,n,p;
int main(){
scanf("%s",s+);
n=strlen(s+);
for(int i=;i<=n;i++){
t=(t+s[i])%;
a[s[i]%]++;
}
//相加和为0直接输出
if(!t){
puts(s+);
return ;
}
for(p=;s[p]=='';p++);
p-=; if(a[t]&&n>&&(p<=||a[t]>||s[]%!=t))
a[t]--;
else if(a[-t]>&&n>)
a[-t]-=;
else if(a[t]&&n>)
a[t]--;
else {
puts("-1");
return ;
}
/*
t==1,那么我们可以删去一个模3等于1的数字位,
或者删去两个模3等于2的数字位(这个很容易漏)。
*/
/*
t==2,可以删去一个模3等于2的数字位,
或者删去两个模3等于1的数字位。
*/
for(int i=;i<=n;i++){
if(s[i]==''&&!flag) continue;
if(a[s[i]%]) {
putchar(s[i]);
a[s[i]%]--;
flag=;
}
}
if(!flag) puts("");
}
动态规划:
设定dp[i][3]=x表示:
1.dp[i][0]:[0~i]中剩余的数字每个位子相加模3为0的删除最少元素的个数。
2.dp[i][1]:[0~i]中剩余的数字每个位子相加模3为1的删除最少元素的个数。
3.dp[i][2]:[0~i]中剩余的数字每个位子相加模3为2的删除最少元素的个数。
dp[i][j]=min(dp[i][j],dp[i-1][((j-a[i]%3)%3+3)%3)];
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int mod = ;
const int maxn = 1e5+;
const int INF = 0x3f3f3f3f;
int dp[maxn][];
int pre[maxn][];
char str[maxn];
char ans[maxn];
int main(){
while(cin>>str){
int n=strlen(str);
if(n==){
if((str[]-'')%==) printf("%c\n",str[]);
else printf("-1\n");
continue;
}
memset(pre,-,sizeof(pre));
memset(dp,INF,sizeof(dp));
dp[][]=;
dp[][(str[]-'')%]=;
for(int i=;i<n;i++){
for(int j=;j<;j++){
if(dp[i-][j]+<dp[i][j]){
dp[i][j]=dp[i-][j]+;
pre[i][j]=j;
}
if((str[i]-'')%==){
if(str[i]==''){
if(dp[i-][j]!=i&&dp[i-][j]<dp[i][j]){
dp[i][j]=dp[i-][j];
pre[i][j]=j;
}
}else{
if(dp[i-][j]<dp[i][j]){
dp[i][j]=dp[i-][j];
pre[i][j]=j;
}
}
}
if((str[i]-'')%==&&dp[i-][((j-)%mod+mod)%mod]<dp[i][j]){
dp[i][j]=dp[i-][((j-)%mod+mod)%mod];
pre[i][j]=((j-)%mod+mod)%mod;
}
if((str[i]-'')%==&&dp[i-][((j-)%mod+mod)%mod]<dp[i][j]){
dp[i][j]=dp[i-][((j-)%mod+mod)%mod];
pre[i][j]=((j-)%mod+mod)%mod;
}
}
}
if(dp[n-][]==n){
int flag=;
for(int i=;i<n;i++){
if(str[i]=='') flag=;
}
if(flag==) printf("0\n");
else printf("-1\n");
continue;
}
int cnt=;
int now=n-;
int j=;
while(now>=){
int pree=pre[now][j];
if(dp[now-][pree]==dp[now][j]){
ans[cnt++]=str[now];
}
j=pree;
now--;
if(now==){
if(pree==(str[]-'')%){
ans[cnt++]=str[now];
}
}
}
for(int i=cnt-;i>=;i--){
printf("%c",ans[i]);
}
printf("\n");
}
}
codeforces 792CDivide by Three(两种方法:模拟、动态规划的更多相关文章
- 探讨instanceof实现原理,并用两种方法模拟实现 instanceof
在开始之前先了解下js数据类型 js基本数据类型: null undefined number boolean string js引用数据类型: function object array 一说ins ...
- Loadrunner 接口测试的两种方法
其实无论用那种测试方法,接口测试的原理是通过测试程序模拟客户端向服务器发送请求报文,服务器接收请求报文后对相应的报文做出处理然后再把应答报文发送给客户端,客户端接收应答报文这一个过程. 方法一.用Lo ...
- 安卓ListView操作的两种方法
举例做一个微信的中间部分(好友消息等信息通知) 第一种:BaseAdapter() package com.example.wx; import java.util.ArrayList;import ...
- 在Activity中响应ListView内部按钮的点击事件的两种方法!!!
在Activity中响应ListView内部按钮的点击事件的两种方法 转载:http://www.cnblogs.com/ivan-xu/p/4124967.html 最近交流群里面有人问到一个问题: ...
- 计算理论:NFA转DFA的两种方法
本文将以两种方法实现NFA转DFA,并利用C语言实现. 方法二已利用HNU OJ系统验证,方法一迷之WA,但思路应该是对的,自试方案,测试均通过. (主要是思路,AC均浮云,大概又有什么奇怪的Case ...
- SQL Server中灾难时备份结尾日志(Tail of log)的两种方法
转自:http://www.cnblogs.com/CareySon/archive/2012/02/23/2365006.html SQL Server中灾难时备份结尾日志(Tail of log) ...
- Java 创建线程的两种方法
Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线 ...
- 【java基础 13】两种方法判断hashmap中是否形成环形链表
导读:额,我介绍的这两种方法,有点蠢啊,小打小闹的那种,后来我查了查资料,别人都起了好高大上的名字,不过,本篇博客,我还是用何下下的风格来写.两种方法,一种是丢手绢法,另外一种,是迷路法. 这两种方法 ...
- windows下获取IP地址的两种方法
windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...
- android 之 启动画面的两种方法
现在,当我们打开任意的一个app时,其中的大部分都会显示一个启动界面,展示本公司的logo和当前的版本,有的则直接把广告放到了上面.启动画面的可以分为两种设置方式:一种是两个Activity实现,和一 ...
随机推荐
- 洛谷(P1006 传纸条)
题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个mm行nn列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运 ...
- Lucene如何实现多条件搜索?
有两种方式可以实现, 一是:Lucene搜索API中提供了一个布尔查询器(BooleanQuery),它可以包含多个查询器,每个查询器Occur枚举控制是“and” 还是“or” BooleanQue ...
- intellij idea之git执行打标签(tag)和删除标签
intellij idea 版本为2017.2.6 进入Version Control-->log 1.在之前版本中,右键,新建标签 2.输入标签名称,建议输入版本号的方式 3.push标签 由 ...
- HBase-site.xml 常见重要配置参数
HBase 常见重要配置参数 (1) Hbase.rpc.timeout rpc 的超时时间,默认 60s,不建议修改,避免影响正常的业务,在线上环境刚开始配置的是 3 秒,运行半天后发现了大量的 t ...
- 洛谷P1364 医院设置
LITTLESUN的第一道图论,撒花~~ 题目链接 这道题是Floyd的板子题 注意对于矩阵图的初始值赋值要全部赋值成最大值 十六进制的最大值表示方式是0x3f3f3f3f memset(G,0x3f ...
- 剁了xp,醉了win7
装完win7,安装各种软件完毕,重启,然并卵. cpu,内存飙升!! svchost.exe这个进程内存发疯了一样往上飙升 从 几十兆 到占用1个多G, 纳尼, 总共物理内存才2G. ╮(╯▽╰) ...
- 如何搭建SBT编译Scala开发的Android工程
作者:戚明峰 最近接触了shadowsocks的Android客户端项目源码(https://github.com/shadowsocks/shadowsocks-android),刚好这个项目是使用 ...
- hadoop中的方法的作用
/* * InputFormat类: * * 作用: * 1.设置输入的形式; * 2.将输入的数据按照相应的形式分割成一个个spilts后再进一步拆分成<key,value> ...
- 从底层带你理解Python中的一些内部机制
下面博文将带你创建一个字节码级别的追踪API以追踪Python的一些内部机制,比如类似YIELDVALUE.YIELDFROM操作码的实现,推式构造列表(List Comprehensions).生成 ...
- mysql数据库----Pymysql
本节重点: pymysql下载和使用 sql注入 增.删.改:conn.commit() 查:fetchone.fetchmany.fetchall 一.pymysql的下载和使用 之前我们都是通过M ...