NOIP模拟测试18「引子·可爱宝贝精灵·相互再归的鹅妈妈」
待补
引子
题解
大模拟,注意细节
代码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「引子·可爱宝贝精灵·相互再归的鹅妈妈」的更多相关文章
- NOIP模拟测试15「建造城市city(插板法)·轰炸·石头剪刀布」
		建造城市 题解 先思考一个简单问题 10个$toot$ 放进5间房屋,每个房屋至少有1个$toot$,方案数 思考:插板法,$10$个$toot$有$9$个缝隙,$5$间房屋转化为$4$个挡板,放在t ... 
- 2019.8.12 NOIP模拟测试18 反思总结
		写个博客总是符合要求的对吧 回来以后第一次悄悄参加考试,昨天全程围观… 然后喜提爆炸120分wwwwwwwww T1用了全机房最慢的写法,导致改掉死循环T掉的一个点以后还是死活过不了最后一个点.T2全 ... 
- NOIP模拟测试19「count·dinner·chess」
		反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ... 
- NOIP模拟测试18(T3待更新)
		T1: 直接模拟,详见代码注释. 复杂度$O(NM)$. Code: #include<iostream> #include<cstdio> #include<vecto ... 
- NOIP模拟测试30「return·one·magic」
		magic 题解 首先原式指数肯定会爆$long$ $long$ 首先根据欧拉定理我们可以将原式换成$N^{\sum\limits_{i=1}^{i<=N} [gcd(i,N)==1] C_{G ... 
- NOIP模拟测试26「嚎叫响彻在贪婪的机房·主仆见证了 Hobo 的离别·征途堆积出友情的永恒」
		题目比较神仙,注意是题目神仙 贪婪暗示贪心,堆积暗示堆优化$\%\%\%\%\%\%\%$ 两个乱搞$+$一个堆优化$dp$ 嚎叫响彻在贪婪的机房 题解 对于一个序列来说只要他们差的$gcd$不为$1 ... 
- NOIP模拟测试21「折纸·不等式」
		折纸 题解 考试时无限接近正解,然而最终也只是接近而已了 考虑模拟会爆炸,拿手折纸条试一试,很简单 考你动手能力 代码 #include<bits/stdc++.h> using name ... 
- NOIP模拟测试10「大佬·辣鸡·模板」
		大佬 显然假期望 我奇思妙想出了一个式子$f[i]=f[i-1]+\sum\limits_{j=1}^{j<=m} C_{k \times j}^{k}\times w[j]$ 然后一想不对得容 ... 
- 20190803 NOIP模拟测试12「斐波那契(fibonacci)· 数颜色 · 分组 」
		164分 rank11/64 这次考的不算太差,但是并没有多大的可能性反超(只比一小部分人高十几分而已),时间分配还是不均,T2两个半小时,T1半个小时,T3-额十几分钟吧 然额付出总是与回报成反比的 ... 
随机推荐
- IOS Widget(5):小组件刷新机制
			引言 前面的章节学完已经让我们可以顺利实现一个小组件了,但是小组件里面的数据如何刷新的呢,本节内容将讲解IOS的刷新机制. 大纲 系统如何管理小组件刷新 Timeline刷新机制 Timeline ... 
- 跟我一起学Go系列:gRPC 入门必备
			RPC 的定义这里就不再说,看文章的同学都是成熟的开发.gRPC 是 Google 开源的高性能跨语言的 RPC 方案,该框架的作者 Louis Ryan 阐述了设计这款框架的动机,有兴趣的同学可以看 ... 
- Spring中@Import注解的使用
			Spring中@Import注解的使用 @Import注解算是SpringBoot自动配置原理中一个很重要的注解 认识@Import注解 先看一下源码 @Target(ElementType.TYPE ... 
- Build 2021 :正式发布.NET 6 Preview4
			微软在不断推进.NET 6的可用性,昨晚的Build 2021大会上发布了Preview4, 这是一个很大的版本更新,带来大量的功能,以及接近最终的产品交付质量,不过,这并不意味着可以在生产环境使用了 ... 
- [Qt] 事件机制(二)
			在samp4_1中加一个小功能,点击右上角关闭按钮时,弹出"确认是否关闭"的消息框.如果点"yes"则关闭,如果点"No"则不关闭 在wid ... 
- nginx版本无缝升级与回滚
			chookie和session 你们公司的会话保持怎么做的? 1.开发做的:记录用户登陆的状态,将用户登陆状态保存到,redis服务器中,nfs,mysql.  记录用户的登陆状态.  通过登陆用 ... 
- linux进阶之gitlab仓库搭建及免密使用
			一.Gitlab简介 GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务. 可通过Web界面进行访问公开的或者私人项目.它拥有与Github类 ... 
- STM32低功耗总结
			之前自己做过一个项目的低功耗大约11ua,那时总结下有几点: 1.外设时钟必须切换为内部时钟: 2.不用的外设全部关闭,要用再开就是了: 3.浮空引脚必须配置为下拉: 4.硬件上的上拉.下拉电阻切记不 ... 
- 10.10 traceroute:追踪数据传输路由状况
			traceroute命令 用于显示网络数据包传输到指定主机的路径信息,追踪数据传输路由状况.默认数据包大小是60字节(IPv4)或80字节(IPv6),用户可另行设置.它与Windows下的trace ... 
- 工作流Activiti框架中表单的使用!详细解析内置表单和外置表单的渲染
			Activiti中的表单 Activiti提供了一种方便而且灵活的方式在业务流程中以手工方式添加表单 对表单的支持有2种方式: 通过表单属性对内置表单进行渲染 通过表单属性对外置表单进行渲染 表单属性 ... 
