目录
☞第一题 数池塘☜
大意
有一个,小农场;下了雨,成池塘;让我们,数池塘。
数据范围
农场面积:(1<=N<=100,1<=M<=100)
思路
暴力深搜
代码
#include<bits/stdc++.h>
#define r(i,a,b) for (int i=a;i<=b;i++)
using namespace std;int n,m;string s;
bool b[101][101];int ans;
const short dx[8]={-1,-1,-1,0,1,1,1,0};
const short dy[8]={-1,0,1,1,1,0,-1,-1};
void dfs(int x,int y)
{
if(x<1||y<1||x>n||y>m||b[x][y]) return;
b[x][y]=1;
r(i,0,7)
dfs(x+dx[i],y+dy[i]);//八个方向
}
int main()
{
freopen("lkcount.in","r",stdin);
freopen("lkcount.out","w",stdout);
cin>>n>>m;
r(i,1,n)
{
cin>>s;
r(j,0,s.size()-1)
if(s[j]=='.') b[i][j+1]=1;//输入
}
r(i,1,n)
r(j,1,m)
if(!b[i][j])//不是障碍
{dfs(i,j);ans++;}//就是池塘
printf("%d",ans);
}
☞第二题 接苹果☜
大意
有两颗,苹果树;它们会,掉苹果;一分钟,掉一个;T分钟,W体力;怎么样,最多果?
数据范围
1<=T<=1000 1<=W<=30
思路
动态规划,设f[i][j]表示第i分钟,移动j次,可以得到的最多苹果。
我们知道,只有两种情况
第一:接住它(有可能要动用体力)
第二:不管他(当要耗费体力的时候)
得出动态转移方程
f[i][j]=x+y;(x为是否能接住,能接住为1,接不住为0,y为上一次的最优值)
代码
#include<bits/stdc++.h>
#define r(i,a,b) for(int i=a;i<=b;i++)
using namespace std;int T,W;
int f[1001][31],m[1001],ans;
int main()
{
freopen("bcatch.in","r",stdin);
freopen("bcatch.out","w",stdout);
scanf("%d %d",&T,&W);
r(i,1,T)
scanf("%d",&m[i]);//输入
r(i,1,T)
{
f[i][0]=f[i-1][0]+m[i]%2;//先变成上次的结果
r(j,1,W)
{
int x=j%2+1==m[i]?1:0;//是否能借助
int y=max(f[i-1][j],f[i-1][j-1]);//上次的最优值
f[i][j]=x+y;
}
}
r(j,0,W)
ans=max(f[T][j],ans);//寻找最优解
printf("%d",ans);//输出
}
☞第三题 find☜
大意
有一堆,无序数;现在要,排个序;找出来,第K大。
思路
比第一题还水,直接sort,直接输出。
代码
#include<bits/stdc++.h>
using namespace std;int n,k,a[3000001],p,d;
bool cmp(int x,int y)//从大到小
{
return x>y;
}
int main()
{
freopen("find.in","r",stdin);
freopen("find.out","w",stdout);
scanf("%d %d",&n,&k);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);//输入
sort(a+1,a+1+n,cmp);//排序
printf("%d",a[k]);//输出
}
☞第四题 最短路线☜
大意
有一个,小表格;让我们,从西南,到东北;问一共,有几条,最短路!
思路
一看表格,立马搜索,看到数据,瞬间崩溃。即刻开始,推出动规!(n,m<=800)
方法:
1.用广搜找出到那里需要几步,再用深搜统计方案,然后从中超出规律,推出转移方程。
2.旋转此矩阵,发现其实就相当于从左上角走到右下角,每个格子的方案数等于上面那个格子加左边那个格子的方案数(只能从这两个格子来嘛),推出转移方程为
f[i][j]=f[i-1][j]+f[i][j-1]
然后输入30,30,立马爆炸(数据太大),于是毅然决定高精度!
好吧,然后只拿了80分,正解是:
滚动压缩+压位高精!!!
代码
#include<bits/stdc++.h>
#define N 80//压了七位,其实压八位更好
#define r(i,a,b) for(int i=a;i<=b;i++)
using namespace std;int n,m,g,l;
int f[2][801][N+1];//滚动+高精
int main()
{
freopen("sline.in","r",stdin);
freopen("sline.out","w",stdout);
scanf("%d %d",&n,&m);if(n<m) swap(n,m);//好吧,这个并没有什么卵用
r(i,1,n)
r(j,1,m)
{
if(j==1||i==1) {f[i&1][j][N]=1;continue;}//特盘
g=0;
for(int k=N;k>0;k--)
{
f[i&1][j][k]=(f[(i+1)&1][j][k]+f[i&1][j-1][k]+g)%10000000;//压位高精加
g=(f[(i+1)&1][j][k]+f[i&1][j-1][k]+g)/10000000;
}
}
l=1;
while(!f[n&1][m][l]&&l<N) l++;//第一个非0位
r(i,l,N)
{
if(i!=l){
if(f[n&1][m][i]<1e6) putchar(48);
if(f[n&1][m][i]<1e5) putchar(48);
if(f[n&1][m][i]<1e4) putchar(48);
if(f[n&1][m][i]<1e3) putchar(48);
if(f[n&1][m][i]<1e2) putchar(48);
if(f[n&1][m][i]<1e1) putchar(48);}//处理前导0
printf("%d",f[n&1][m][i]);//输出
}
}
☞第五题 棋盘覆盖☜
大意
有一个,小棋盘;有一格,特殊的:现在用,L型牌;来覆盖,这张图!
思路
分治算法,分而治之!
代码
#include<bits/stdc++.h>
using namespace std;
int a[1025][1025],tail=1;
int n,nx,ny;
void dfs(int x,int y,int qx,int qy,int size)
{
if(size==1) return;
int t=tail++;
int s=size/2;
if(qx>=x+s&&qy>=y+s)//右下角
{
a[x+s-1][y+s-1]=t;//左上
a[x+s-1][y+s]=t;//右上
a[x+s][y+s-1]=t;//左下
dfs(x,y,x+s-1,y+s-1,s);//左上
dfs(x+s,y,x+s,y+s-1,s);//左下
dfs(x,y+s,x+s-1,y+s,s);//右上
dfs(x+s,y+s,qx,qy,s);//右下
}
if(qx>=x+s&&qy<y+s)//左下角
{
a[x+s-1][y+s-1]=t;//左上
a[x+s-1][y+s]=t;//右上
a[x+s][y+s]=t;//右下
dfs(x,y,x+s-1,y+s-1,s);//左上
dfs(x+s,y,qx,qy,s);//左下
dfs(x,y+s,x+s-1,y+s,s);//右上
dfs(x+s,y+s,x+s,y+s,s);//右下
}
if(qx<x+s&&qy>=y+s)//右上角
{
a[x+s-1][y+s-1]=t;//左上
a[x+s][y+s-1]=t;//左下
a[x+s][y+s]=t;//右下
dfs(x,y,x+s-1,y+s-1,s);//左上
dfs(x+s,y,x+s,y+s-1,s);//左下
dfs(x,y+s,qx,qy,s);//右上
dfs(x+s,y+s,x+s,y+s,s);//右下
}
if(qx<x+s&&qy<y+s)//左上角
{
a[x+s-1][y+s]=t;//右上
a[x+s][y+s-1]=t;//左下
a[x+s][y+s]=t;//右下
dfs(x,y,qx,qy,s);//左上
dfs(x+s,y,x+s,y+s-1,s);//左下
dfs(x,y+s,x+s-1,y+s,s);//右上
dfs(x+s,y+s,x+s,y+s,s);//右下
}
}
int main()
{
freopen("chessboard.in","r",stdin);
freopen("chessboard.out","w",stdout);
scanf("%d",&n);
scanf("%d%d",&nx,&ny);
dfs(1,1,nx,ny,n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
printf("%d%c",a[i][j]==0?-1:a[i][j],j==n?'\n':' ');//输出
}