总目录详见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」新数独