待补

引子

题解

大模拟,注意细节

代码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. Pycharm集成码云,图文手把手教学!

    Pycharm集成码云 码云(http://gitee.com)是开源中国推出的代码托管平台,支持 Git 和 SVN,提供免费的私有仓库托管 可以通过码云保管你的代码,每次修改完代码提交,就是一个版 ...

  2. 基于Gitlab的CICD流程

    本片文章主要初步介绍什么是CICD流程,并且把整个流程进行拆分理解整个流程的跑通过程. 1.CICD概述 什么是CICD呢? 简单的说CICD就是持续集成自动构建自动测试自动部署. 从概念上就可以看出 ...

  3. ImageIo.read 返回null

    一.问题描述 今天收到一个bug就是imageio读取图片会返回null,具体如下 但是其他的图片就没有问题 二.问题分析 结合百度发现这张图片原本的后缀并非是jpg,使用notpard++打开就可以 ...

  4. 一种巧妙的使用 CSS 制作波浪效果的思路

    在之前,我介绍过几种使用纯 CSS 实现波浪效果的方式,关于它们有两篇相关的文章: 纯 CSS 实现波浪效果! 巧用 CSS 实现酷炫的充电动画 本文将会再介绍另外一种使用 CSS 实现的波浪效果,思 ...

  5. ElasticSearch实战系列十一: ElasticSearch错误问题解决方案

    前言 本文主要介绍ElasticSearch在使用过程中出现的各种问题解决思路和办法. ElasticSearch环境安装问题 1,max virtual memory areas vm.max_ma ...

  6. Vue3响应式系统api 之 ref reactive

    reactive 接收一个普通对象然后返回该普调对象的响应式代理.等同于2.x的  Vue.observable() Vue3中响应数据核心是 reactive , reactive 中的实现是由 P ...

  7. [刷题] 3 Longest Substring Without Repeating Character

    要求 在一个字符串中寻找没有重复字母的最长子串 举例 输入:abcabcbb 输出:abc 细节 字符集?字母?数字+字母?ASCII? 大小写是否敏感? 思路 滑动窗口 如果当前窗口没有重复字母,j ...

  8. 好好好重要常用必备linux命令

    查看当前目录下文件个数: $find ./ | wc -l 以上这个命令用到的频率如此之高,以至于我们需要为它建立一个快捷命令方式: 在.bashrc 中设置命令别名: alias lsl='ls - ...

  9. 2020 Kali Linux Zenmap 安装(可视化界面)

    跟着教程学Kali Linux,我安装的2020版的,发现Zemap没被预装. 1.下载 zenmap https://nmap.org/download.html 2.rpm转deb 2020 Ka ...

  10. scrapy奇技淫巧1

    Request传递值到callback回调函数 def parse(self, response): request = scrapy.Request('http://www.example.com/ ...