待补

引子

题解

大模拟,注意细节

代码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. 【java框架】SpringBoot(7) -- SpringBoot整合MyBatis

    1.整合MyBatis操作 前面一篇提到了SpringBoot整合基础的数据源JDBC.Druid操作,实际项目中更常用的还是MyBatis框架,而SpringBoot整合MyBatis进行CRUD也 ...

  2. 【技术博客】忘记密码界面的Vue前端实现

    一.基本流程 [登录界面] --> [点击忘记密码] --> [输入个人邮箱和验证码] --> [系统发送邮箱验证] --> [用户在限定时间内登录邮箱,查收验证码] --&g ...

  3. CRM帮助B2B企业持续改善战略决策「下篇」

    尽管数据早已深入人心,但依然有相当比率的B2B企业在管理和战略决策时依赖直觉而不是客户数据.不停变化的B2B市场表明了以客户为中心的趋向和格局,CRM客户管理系统能够协助您更好的使用客户数据并最大限度 ...

  4. .NetCore&#183;集成Ocelot组件之完全解决方案

    阅文时长 | 11.04分钟 字数统计 | 17672.8字符 主要内容 | 1.前言.环境说明.预备知识 2.Ocelot基本使用 3.Ocelot功能挖掘 4.Ocelot集成其他组件 5.避坑指 ...

  5. shell中的 “.”和source export

    在shell脚本里面export的环境变量,在set里面竟然看不到.为什么在shell脚本里面用export设置环境变量之后,当shell执行完了,用set命令看不到呢?但是你如果直接在终端里expo ...

  6. font

    font属性简写 front: font-style font-variant font-weight font-size/line-height font-family 说明: 值之间空格隔开 注意 ...

  7. [bug] 安装MySQL8.0.15 失败,提示This application requires Visual Studio 2015 x64 Redistributable

    参考 https://blog.csdn.net/weixin_44092289/article/details/88045666

  8. javaWeb——Servlet(二)

    Servelet登录页面步骤: 浏览器访问http://127.0.0.1/login.html 浏览器通过form把账号和密码提交到/login(通过action),附带method="p ...

  9. Docker------Linux安装Docker

    1.添加yum源 yum install epel-release –y yum clean all yum list 2.安装并运行Docker yum install docker-io –y s ...

  10. mysql有关配置

    mysql有关配置 mysql安装 mysql安装方式有三种 源代码:编译安装 二进制格式的程序包:展开至特定路径,并经过简单配置后即可使用 程序包管理器管理的程序包: rpm:有两种 OS Vend ...