2017年11月9日训练总结

这次训练日记是11月6日到11月9号。

总体来说,数位DP专题清掉了所有的水题。。。剩下的题暂时还没想出怎么做,而且我也只会递归这一种写法。(状态转移的写法只会简单的)。cf打了一场比赛(惨,2题),昨晚打了一场比赛(较惨,3题)。看了字典树的模板,但是还未应用去A题。。。看样子应该不太难。这几天状态不太好,一是因为课程的增多,又面临部分课程将要结课,作业指数增长,占用了大部分课余时间,另一方面宿舍神奇的舍友有3个人在中午午休和晚上的时候开着外放打游戏还大声讨论,吵着本来就睡眠质量不好的我更睡不着,每天都是12点半以后才睡的,宿舍10点45就停电又没法写代码。这几天一直没精神上课也是。(不怕神一样的敌人,就怕猪一样的舍友)。现在我都快疯了。。。

昨晚的比赛有点惨,读题特别慢,手速也慢,虽然前1小时出了3题,不过后面服务器炸了之后,想做E题也不知道对错。。。交了三发,早上起来一看是WR。仔细思考后发现每颗树的ice都要从小到大排序(用set)。。。涂色的时候将该节点中涂过颜色的ice的颜色记录下来,再给别的ice涂颜色的时候就可以贪心,从最小颜色编号的开始涂。。。剩下的就是简单的dfs了。其实也不难,这种题目以后遇到一定要做出来。。。至于cf的比赛,前两题都是思维题,读题慢依然是大问题。第三题是给你魔方的六个面和编号以及颜色,判断该2*2阶魔方是否只转动一次就可以使6个面颜色相同。直接暴力枚举三种大情况就行,因为如果满足条件,那么一定有两个面是相同的。但是要注意这一下必须得转,也就是说原来就是6个面相同的话是不符合要求的。。。(WR on test 19 Orz)。。。同时研究了下打的上一次cf中的D题,也不算太难,就是bfs优化,直接暴力会超时。昨天就想做,一直没理清思路,今天终于A了。下面贴上代码。。。(bfs dfs这两天都遇到题了,以前的知识得好好复习了。。。)

这周要把字典树清完,主要是中下等难度的题目。。。数位DP可以尝试较难的题目来巩固提高。下周要快点开始AC自动机。继续抽时间在cf上打比赛。及时调整状态。。希望大四的舍友能理解一下几乎天天满课的我们。。。

cf 877D:

思路:(bfs优化)

AC代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
char s[1010][1010];
bool jud[1005][1005];
int dis[1005][1005];
int n,m,k;
int dxy[8]={1,0,-1,0,0,1,0,-1};
struct node{
 int x,y;
 int ans;
}st,ed;
queue q;
void bfs()
{
    dis[st.x][st.y]=0;node no;
    while(!q.empty()){
    no=q.front();
    node nn=no;
    q.pop();jud[no.x][no.y]=0;
    for(int i=0;i<4;i++)
    {
    for(int j=1;j<=k;j++){//枚举沿这个方向走1到k步
     nn.x=no.x+j*dxy[i];nn.y=no.y+j*dxy[i+4];
     nn.ans=no.ans+1;
     if(nn.x<=n&&nn.x>=1&&nn.y>=1&&nn.y<=m&&s[nn.x][nn.y]!='#'&&!(dis[nn.x][nn.y]!=0x3f3f3f3f&&dis[nn.x][nn.y]<no.ans+1))
     {
         if(!jud[nn.x][nn.y]&&nn.ans<dis[nn.x][nn.y])//只保存最短时间
         {
             jud[nn.x][nn.y]=1;
             dis[nn.x][nn.y]=nn.ans;
             q.push(nn);
         }
    }
    else break;//遇到墙或者到边界或者用时已经大于以前走到这里的时间就不继续走下去了
    }
    }
    }
    if(dis[ed.x][ed.y]==0x3f3f3f3f) cout<<-1<<endl;//走不到目标点
    else cout<<dis[ed.x][ed.y]<<endl;
}
int main() {
    ios::sync_with_stdio(false);
    int t,i,j,l;
    int cas=1,ans,flag;
    while(cin>>n>>m>>k)
    {queue qq;
     q=qq;
        for(i=1;i<=n;i++)
        for(j=1;j<=m;j++) {cin>>s[i][j];jud[i][j]=0;dis[i][j]=0x3f3f3f3f;}//初始化,用scanf的话还得另外初始化dis和jud,嫌麻烦直接cin了。。。
        cin>>st.x>>st.y>>ed.x>>ed.y;
        st.ans=0;
        q.push(st);
        bfs();
    }
        //printf("Case #%d: %lld\n",cas++,solve(y)-solve(x-1));
    return 0;
}

你可能感兴趣的:(训练日记)