待补

引子

题解

大模拟,注意细节

代码1

#include<bits/stdc++.h>
using namespace std;
int n,m;char a[1005][1005];bool vst[1005][1005];
void solve(int na,int nb)
{
int i=na,j=nb,now=0;
while(1){
j++;if(a[na][j]=='+')break;
}
while(1){
i++;if(a[i][nb]=='+')break;
}
for(int k=na+1;k<i;k++){
for(int l=nb+1;l<j;l++)if(a[k][l]>='0'&&a[k][l]<='9')now=now*10+a[k][l]-'0';
if(now)break;
}
for(int k=i;k>=na;k--){
if(j<=m&&a[k][j+1]=='-'){
int ni=k,nj=j+1;vst[ni][nj]=1;
while(1){
while(1){
if((a[ni][nj+1]=='-'||a[ni][nj+1]=='+')&&!vst[ni][nj+1])nj++;
else nj--;vst[ni][nj]=1;
if(a[ni][nj]=='+')break;
}
while(1){
ni++;vst[ni][nj]=1;
if(a[ni][nj]=='+'||a[ni][nj]=='-')break;
}
if(a[ni][nj]=='-')break;
}
while(a[ni][nj]!='+')nj--;solve(ni,nj);
}
else if(nb&&a[k][nb-1]=='-'){
int ni=k,nj=nb-1;
vst[ni][nj]=1;
while(1){
while(1){
if((a[ni][nj+1]=='-'||a[ni][nj+1]=='+')&&!vst[ni][nj+1])nj++;
else nj--;vst[ni][nj]=1;
if(a[ni][nj]=='+')break;
}
while(1){
ni++;vst[ni][nj]=1;
if(a[ni][nj]=='+'||a[ni][nj]=='-')break;
}
if(a[ni][nj]=='-')break;
}
while(a[ni][nj]!='+')nj--;
solve(ni,nj);
}
}
printf("%d\n",now);
}
int main()
{
bool fir=0;
int sta,stb;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
char c=getchar();
while(c!='+'&&c!='|'&&c!='-'&&c!='.'&&(c>'9'||c<'0'))c=getchar();
a[i][j]=c;
if(a[i][j]=='+'&&!fir)sta=i,stb=j,fir=1;
}
solve(sta,stb);
return 0;
}

代码2

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 1111
char ch[A][A];
ll n,m,top=0;
ll h[A][A],stax[A],stay[A],low[A],len[A],sta[A];
ll chuanx,chuany;
bool vis[A][A];
struct node {
ll hang,id;
friend bool operator < (const node &a,const node &b){
return a.hang<b.hang;
}
};
priority_queue <node> high[A];
const ll nowx[5]={0,1,-1,0,0};
const ll nowy[5]={0,0,0,1,-1};
//1右0左2下
void pre(ll x,ll y,ll fx){ if(h[x][y]){
// printf("x=%lld y=%lld h=%lld fx=%lld\n",x,y,h[x][y],fx);
chuanx=x,chuany=y;
return ;
}
if(ch[x][y]=='+'){
if(fx==0||fx==1){
pre(x+1,y,2);
}
if(fx==2){
if(ch[x][y+1]=='-')
pre(x,y+1,1);
if(ch[x][y-1]=='-')
pre(x,y-1,0);
}
}
else{
if(fx==1&&y+1<=m)
pre(x,y+1,1);
if(fx==0&&y-1>=1)
pre(x,y-1,0);
if(fx==2&&x+1<=n)
pre(x+1,y,2);
}
}
void dfs(ll num){
while(!high[num].empty()){
ll x=high[num].top().id;
// printf("hang=%lld\n",high[num].top().hang);
high[num].pop();
dfs(x);
}
low[++low[0]]=num;
}
void del(ll x,ll y,ll num){
top=1;
// printf("num=%lld\n",num);
stax[top]=x,stay[top]=y;
while(top){
ll x=stax[top],y=stay[top];
h[x][y]=num;
top--;
for(ll i=1;i<=4;i++){
ll x2=x+nowx[i],y2=y+nowy[i];
h[x2][y2]=num;
// printf("x2=%lld y2=%lld\n",x2,y2);
if((ch[x2][y2]=='.'||isdigit(ch[x2][y2]))&&!vis[x2][y2]){
top++;
stax[top]=x2,stay[top]=y2;
vis[x2][y2]=1;
}
}
}
// printf("*********************%lld\n",h[14][61]);
}
void bfs(){
for(ll i=1;i<=n;i++)
for(ll j=1;j<=m;j++){
if(isdigit(ch[i][j])){
// printf("ch[%lld][%lld]=%d\n",i,j,ch[i][j]-'0');
ll x=ch[i][j]-'0';
for(ll w=j+1;w<=m;w++){
if(isdigit(ch[i][w]))
x=x*10+ch[i][w]-'0';
else break;
}
// printf("x1=%lld x2=%lld x3=%lld\n",x,x2,x3);
if(!vis[i][j])del(i,j,x);
}
}
/* for(ll i=1;i<=n;i++,puts(""))
for(ll j=1;j<=m;j++){
printf("%lld",h[i][j]);
}
*/ for(ll i=1;i<=n;i++)
for(ll j=1;j<=m;j++){
if(ch[i][j]=='|'){
if(ch[i][j+1]=='-'){
pre(i,j+1,1);
node no;
// printf("i=%lld j=%lld h=%lld chan=%lld %lld h=%lld\n",i,j,h[i][j],chuanx,chuany,h[chuanx][chuany]);
no.hang=i,no.id=h[chuanx][chuany];
high[h[i][j]].push(no);
}
if(ch[i][j-1]=='-'){
pre(i,j-1,0);
node no;
// printf("i=%lld j=%lld h=%lld chan=%lld %lld h=%lld\n",i,j,h[i][j],chuanx,chuany,h[chuanx][chuany]);
no.hang=i,no.id=h[chuanx][chuany];
high[h[i][j]].push(no);
}
}
} dfs(1);
for(ll i=1;i<=low[0];i++){
printf("%lld\n",low[i]);
}
} int main(){
// freopen("wos.txt","w",stdout);
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++){
scanf("%s",ch[i]+1);
}
bfs();
}

可爱宝贝精灵

题解

一个不错的dfs题(还能练习剪枝)

一个不错的dp题

思考dp数组含义

首先我们知道我们到一个有小精灵地方就必须抓住它(显然)而不是来回逛几圈再次经过它再抓

然后我们只要从一个方向走就必须抓住至少一只小精灵,转向之后也至少抓住一只精灵,(否则你走这一段就是没用的)

$i,j$分别表示当前最左到$i$最右到$j$时的最大值

设$f[i][j]$肯定不行时间难以确认,多一维表示时间$f[t][i][j]$也难以确定,然而你在左面还是右面依然难以确定

那么再加一维$f[t][i][j][2]$中$[1]$表示在右面,$[0]$表示在左面

转移很好转移,不像昨天那个傻逼t2式子

类似离散化一下

假如当前l,你可以走到r或者l-1

假如当前r,你可以走到l或者r+1

用式子表示就是

从$r$走到$l+1$再走到$l$

从$l$走到$r-1$再走到$r$

$f[i][l][r][0]=max(f[max(i-dis(l,l+1),0)][l+1][r][0],f[max(i-dis(l,r),0)][l+1][r][1])+Val;$
$f[i][l][r][1]=max(f[max(i-dis(r-1,r),0)][l][r-1][1],f[max(i-dis(l,r),0)][l][r-1][0])+Val;$

注意一下初始化!

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define py printf("tys is sb\n")
#define A 2010
ll f[A][118][118][2];
struct pocky{
ll pla,val,tim;
friend bool operator < (const pocky &a, const pocky &b){
return a.pla<b.pla;
}
}texas[A];
ll dis(ll l,ll r){
return abs(texas[r].pla-texas[l].pla);
}
ll n,k,m,mx,mid,ans;
void debuger(ll x){
for(ll i=1;i<=m;i++,puts(""))
for(ll j=i+1;j<=m;j++){
printf("f[%lld][%lld][%lld]=%lld %lld\n ",x,i,j,f[x][i][j][1],f[x][i][j][0]);
}
}
int main(){
scanf("%lld%lld%lld",&n,&k,&m);
for(ll i=1;i<=m;i++){
scanf("%lld%lld%lld",&texas[i].pla,&texas[i].val,&texas[i].tim);
mx=max(mx,texas[i].tim);
}
memset(f,-0x3f,sizeof(f));
m++;
texas[m].pla=k,
texas[m].val=0,
texas[m].tim=mx;
sort(texas+1,texas+m+1);
for(ll i=1;i<=m;i++){
if(texas[i].pla==k&&texas[i].val==0){
mid=i;
break;
}
}
f[0][mid][mid][0]=0;
f[0][mid][mid][1]=0;
// printf("mid=%lld \n",texas[mid].pla);
for(ll i=mid-1;i>=1;i--){
ll tim=texas[mid].pla-texas[i].pla;
// printf("tim=%lld i=%lld mid=%lld \n",tim,i,mid);
f[tim][i][mid][0]=f[dis(mid,i+1)][i+1][mid][0]+((tim<texas[i].tim)?texas[i].val:0);
ans=max(ans,f[tim][i][mid][0]);
}
for(ll i=mid+1;i<=m;i++){
ll tim=texas[i].pla-texas[mid].pla;
f[tim][mid][i][1]=f[dis(mid,i-1)][mid][i-1][1]+((tim<texas[i].tim)?texas[i].val:0);
ans=max(ans,f[tim][mid][i][1]);
}
// printf("ans=%lld\n",ans);
for(ll i=1;i<=mx;i++)
for(ll l=1;l<=mid-1;l++)
for(ll r=mid+1;r<=m;r++){
f[i][l][r][0]=max(f[max(i-dis(l,l+1),0ll)][l+1][r][0],f[max(i-dis(l,r),0ll)][l+1][r][1])+((i<texas[l].tim)?texas[l].val:0);
f[i][l][r][1]=max(f[max(i-dis(r-1,r),0ll)][l][r-1][1],f[max(i-dis(l,r),0ll)][l][r-1][0])+((i<texas[r].tim)?texas[r].val:0);
ans=max(ans,max(f[i][l][r][0],f[i][l][r][1]));
// printf(" f[%lld][%lld][%lld][0]=%lld [%lld][%lld][%lld][1]=%lld\n",i,l,r,f[i][l][r][0],i,l,r,f[i][l][r][1]);
}
printf("%lld\n",ans);
}

相互在归的鹅妈妈

NOIP模拟测试18「引子·可爱宝贝精灵·相互再归的鹅妈妈」的更多相关文章

  1. NOIP模拟测试15「建造城市city(插板法)·轰炸·石头剪刀布」

    建造城市 题解 先思考一个简单问题 10个$toot$ 放进5间房屋,每个房屋至少有1个$toot$,方案数 思考:插板法,$10$个$toot$有$9$个缝隙,$5$间房屋转化为$4$个挡板,放在t ...

  2. 2019.8.12 NOIP模拟测试18 反思总结

    写个博客总是符合要求的对吧 回来以后第一次悄悄参加考试,昨天全程围观… 然后喜提爆炸120分wwwwwwwww T1用了全机房最慢的写法,导致改掉死循环T掉的一个点以后还是死活过不了最后一个点.T2全 ...

  3. NOIP模拟测试19「count·dinner·chess」

    反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...

  4. NOIP模拟测试18(T3待更新)

    T1: 直接模拟,详见代码注释. 复杂度$O(NM)$. Code: #include<iostream> #include<cstdio> #include<vecto ...

  5. NOIP模拟测试30「return·one·magic」

    magic 题解 首先原式指数肯定会爆$long$ $long$ 首先根据欧拉定理我们可以将原式换成$N^{\sum\limits_{i=1}^{i<=N} [gcd(i,N)==1] C_{G ...

  6. NOIP模拟测试26「嚎叫响彻在贪婪的机房·主仆见证了 Hobo 的离别·征途堆积出友情的永恒」

    题目比较神仙,注意是题目神仙 贪婪暗示贪心,堆积暗示堆优化$\%\%\%\%\%\%\%$ 两个乱搞$+$一个堆优化$dp$ 嚎叫响彻在贪婪的机房 题解 对于一个序列来说只要他们差的$gcd$不为$1 ...

  7. NOIP模拟测试21「折纸&#183;不等式」

    折纸 题解 考试时无限接近正解,然而最终也只是接近而已了 考虑模拟会爆炸,拿手折纸条试一试,很简单 考你动手能力 代码 #include<bits/stdc++.h> using name ...

  8. NOIP模拟测试10「大佬·辣鸡·模板」

    大佬 显然假期望 我奇思妙想出了一个式子$f[i]=f[i-1]+\sum\limits_{j=1}^{j<=m} C_{k \times j}^{k}\times w[j]$ 然后一想不对得容 ...

  9. 20190803 NOIP模拟测试12「斐波那契(fibonacci)· 数颜色 · 分组 」

    164分 rank11/64 这次考的不算太差,但是并没有多大的可能性反超(只比一小部分人高十几分而已),时间分配还是不均,T2两个半小时,T1半个小时,T3-额十几分钟吧 然额付出总是与回报成反比的 ...

随机推荐

  1. .NET 反射(Reflection)

    这节讲一下.NET 中的一个技术:反射(Reflection). 反射是一种很重要的技术,它可以在程序运行时,动态的获取类的实例,并调用实例中的任何方法.它就像一面镜子,映射出一个类的所有细节.    ...

  2. QFNU-ACM 2019.5.23组队赛 2019山东省赛复现

    A.Calandar 题意:一年12个月,一个月30天,5天一周,已知某天的年月日星期数,求所给年月日的星期数是多少 思路:直接进行计算,其实每个月每年都是等长度的就使得计算的时候忽略年月,可以直接进 ...

  3. netcore3.1 webapi使用signalR

    前言 今天尝试了一下signalR,感觉还不错,因为暂时用不到,就写一篇博文来记录搭建过程,以免以后给忘了,基于官方文档写的,不过官方没有webapi调用例子,就自己写了一下,大神勿喷 使用 1.创建 ...

  4. Redis学习笔记六:持久化实验(AOF,RDB)

    作者:Grey 原文地址:Redis学习笔记六:持久化实验(AOF,RDB) Redis几种持久化方案介绍和对比 AOF方式:https://blog.csdn.net/ctwctw/article/ ...

  5. [设计模式] 设计模式课程(十六)-- 备忘录模式(Memento)

    概述 也叫快照(SnapShot) 属于行为类设计模式 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态 软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能回溯到对象之前 ...

  6. [刷题] 112 Path Sum

    要求 给出一个二叉树及数字sum,判断是否存在一条从根到叶子的路径,路径上的所有节点和为sum 实现 转化为寻找左右子树上和为 sum-root 的路径,到达叶子节点时递归终止 注意只有一个孩子时,根 ...

  7. zip密码破解小脚本

    zip密码破解小脚本 博主: 逍遥子 发布时间:2018 年 05 月 31 日 2745次浏览 1 条评论 1074字数 分类: kali 专栏 首页 正文 分享到:    文件源码 import ...

  8. CentOS6.7系统文本安装-2020

    CentOS6.7系统文本安装 [日期:2016-01-30] 来源:Linux社区  作者:endmoon [字体:大 中 小]   一.选择虚拟机软件 1)VMware Workstation   ...

  9. 使用sosreport命令生成诊断包

    [RHEL]-7-常用系统状态检测命令 引言 这篇文章介绍RHEL中最常用的几个系统状态检测命令,包括:网络状态.内存.主机名及其架构.系统负载及其用户登录状态等. 文章目录 0×1.查看网络状态 0 ...

  10. CentOS 7系统启动后怎么从命令行模式切换到图形界面模式

    CentOS 7系统启动后怎么从命令行模式切换到图形界面模式原创传智播客官方博客 最后发布于2020-04-08 15:44:43 阅读数 88 收藏展开一.存在问题 在VMware虚拟机中成功安装c ...