重走长征路---OI每周刷题记录---2月1日 2014

总目录详见https://blog.csdn.net/mrcrack/article/details/84471041

做题原则,找不到测评地址的题不做。2018-11-28

重走长征路---OI每周刷题记录---2月1日  2014

本周共计23题+题

测评地址:

dfs20分

1.「codevs2800」送外卖 

迭代dfs20分

2.「codevs2495」水叮当的舞步 

迭代dfs

3.「codevs1049」棋盘染色  

kruskal

4.「JoyOI1307」联络员 

5.「bzoj1821」Group 部落划分

网络流

6.「JoyOI1338」QQ农场 

7.「codevs1022」覆盖 

8.「codevs1993」草地排水(边表) 

spfa

9.「JoyOI1136」火焰巨魔的惆怅 

10.「JoyOI1326」剑人合一 

背包dp

11.「JoyOI1028」Bessie的体重问题 

快速幂

12.「JoyOI1118-1119」a^b1-2 

模拟

13.「JoyOI1081」最近距离 

bfs

14.「JoyOI1083」分糖果 

线段树

15.「NOIP2012」借教室 

16.「bzoj3038」上帝造题的七分钟2 

17.「codevs1299」切水果 

状压DP

18.「bzoj1087」互不侵犯King 

数学

19.「bzoj1041」圆上的整点 

20.「JoyOI1109」幻方 

A*+dfs

21.「bzoj1085」骑士精神 

tarjan

22.「codevs2822」爱在心中

dfs

23.「bzoj3109」新数独 

题解:

dfs20分

1.「codevs2800」送外卖 

迭代dfs20分

2.「codevs2495」水叮当的舞步 

迭代dfs

3.「codevs1049」棋盘染色  

kruskal

4.「JoyOI1307」联络员 

5.「bzoj1821」Group 部落划分

网络流

6.「JoyOI1338」QQ农场 

7.「codevs1022」覆盖 

8.「codevs1993」草地排水(边表) 

spfa

9.「JoyOI1136」火焰巨魔的惆怅 

10.「JoyOI1326」剑人合一 

背包dp

11.「JoyOI1028」Bessie的体重问题 

快速幂

12.「JoyOI1118-1119」a^b1-2 

模拟

13.「JoyOI1081」最近距离 

bfs

14.「JoyOI1083」分糖果 

线段树

15.「NOIP2012」借教室 

16.「bzoj3038」上帝造题的七分钟2 

17.「codevs1299」切水果 

状压DP

18.「bzoj1087」互不侵犯King 

//P1896 [SCOI2005]互不侵犯
//在线测评地址https://www.luogu.org/problemnew/show/P1896
//深搜,估计能拿30分
//r=a[j]/n,c=a[j]%n;//此处写成r=a[i]/n,c=a[i]%n;出现段错误
//r=a[j]/n,c=a[j]%n,flag=0;//此处写成r=a[i]/n,c=a[i]%n,flag=0;
//提交50分,测试点6-10TLE。很是满意。2019-3-8 20:09
//以下为50分代码。
//从原理角度,此文写得很不错https://blog.csdn.net/jiangshibiao/article/details/23732795
//https://www.luogu.org/problemnew/solution/P1896此文中 作者: 冰冻赤道 更新时间: 2018-08-20 20:43注释写得相当棒
//注意,编好一个功能,需马上测试一个功能。
//样例通过,提交AC。2019-3-11
#include <stdio.h>
#include <string.h>
#define LL long long
int N,K,state[250],king[250],cnt=0;//state[]表示一行有效国王站位,king[]表示该状态国王数量
LL dp[12][250][100];//250的得来,是测试了N=0-9得来的
void init(){
    int tot,i;
    tot=(1<<N)-1;
    for(i=0;i<=tot;i++)
        if(((i<<1)&i)==0)
            cnt++,state[cnt]=i;
    for(i=1;i<=cnt;i++){
        tot=state[i];
        while(tot){
            if(tot&1)king[i]++;//统计国王个数
            tot>>=1;
        }
    }
}
void solve(){
    int i,j,p,s;
    LL ans=0;
    memset(dp,0,sizeof(dp));
    for(j=1;j<=cnt;j++)
        if(king[j]<=K)//漏了此处判定
            dp[1][j][king[j]]=1;//第一行
    for(i=2;i<=N;i++)
        for(j=1;j<=cnt;j++)//当前层
            for(p=1;p<=cnt;p++){//上一层
                if(state[j]&state[p])continue;//同一列
                if(state[j]&(state[p]>>1))continue;//左上角
                if(state[j]&(state[p]<<1))continue;//右上角
                for(s=king[j];s<=K;s++) dp[i][j][s]+=dp[i-1][p][s-king[j]];//这一段,可以通过跟踪数据理解。
            }
    for(j=1;j<=cnt;j++) ans+=dp[N][j][K];
    printf("%lld\n",ans);
}
int main(){
    scanf("%d%d",&N,&K);
    init();
    solve();
    return 0;
}

//P1896 [SCOI2005]互不侵犯
//在线测评地址https://www.luogu.org/problemnew/show/P1896
//深搜,估计能拿30分
//r=a[j]/n,c=a[j]%n;//此处写成r=a[i]/n,c=a[i]%n;出现段错误
//r=a[j]/n,c=a[j]%n,flag=0;//此处写成r=a[i]/n,c=a[i]%n,flag=0;
//提交50分,测试点6-10TLE。很是满意。2019-3-8 20:09
//以下为50分代码。
#include <stdio.h>
#include <string.h>
int next[][2]={{0,-1},{0,1},{-1,0},{1,0},{-1,-1},{-1,1},{1,-1},{1,1}};//上,下,左,右,左上,左下,右上,右下
int n,k,a[100],map[15][15];
long long cnt=0;
void dfs(int step){
    int i,j,p,r,c,nr,nc,flag;
    if(step==k+1){
        memset(map,0,sizeof(map));
        for(j=1;j<=k;j++){
            r=a[j]/n,c=a[j]%n;//此处写成r=a[i]/n,c=a[i]%n;出现段错误
            map[r][c]=1;
        }
        for(j=1;j<=k;j++){
            r=a[j]/n,c=a[j]%n,flag=0;//此处写成r=a[i]/n,c=a[i]%n,flag=0;
            for(p=0;p<8;p++){
                nr=r+next[p][0],nc=c+next[p][1];
                if(0<=nr&&nr<n*n&&0<=nc&&nc<n*n&&map[nr][nc]){//判断是否冲突
                    flag=1;
                    break;
                }
            }
            if(flag==1)break;
        }
        if(flag==0)cnt++;
        return ;
    }
    for(i=a[step-1]+1;i<n*n;i++){
        a[step]=i;
        dfs(step+1);
    }
}
int main(){
    scanf("%d%d",&n,&k);
    a[0]=-1;
    dfs(1);
    printf("%lld\n",cnt);
    return 0;
}

数学

19.「bzoj1041」圆上的整点 

20.「JoyOI1109」幻方 

A*+dfs

21.「bzoj1085」骑士精神 

tarjan

22.「codevs2822」爱在心中

dfs

23.「bzoj3109」新数独 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值