题目传送门:First Step (ファーストステップ) - 洛谷
主要思路
分别找到横竖的连续的>=k的长度,计算其排列的和
如何计算在长度为x的线段上有多少段长度为y的线段呢?x-y+1
具体参见一道暴力枚举题目:
我的AC CODE:
#include<iostream>
using namespace std;
long long f,c;
int hlong(int x,int y){
//x长的线段上有多少段y长的线段
return x-y+1;
}
int main(){
int n,m;
cin>>n>>m;
for(int x=1;x<=n;x++){
for(int y=1;y<=m;y++)
{
int tmp=hlong(n,x)*hlong(m,y);
if(x==y){
f+=tmp;
}else{
c+=tmp;
}
}
}
cout<<f<<" "<<c;
}
这道题也是一样的,不难
难就难在1必须特判!!因为会被重复计算2次(不特判喜提80分CODE:登录 - Luogu Spilopeliahttps://www.luogu.com.cn/record/160924159)
附上AC CODE:
#include<iostream>
#include<cstring>
using namespace std;
bool pd[101][101];
int all,n,m,k,anss=0;
void t(){
//手贱一定要写一个函数(
//无返回值,别写成int 了( 不然喜提RE
all+=anss-k+1;
}
int main(){
cin>>n>>m>>k;
string x;
for(int i=1;i<=n;i++){
cin>>x;
for(int j=0;j<m;j++)
{
if(x[j]=='.') pd[i][j+1]=true;
}
}
for(int i=1;i<=n;i++){
//模拟行
anss=0;//记得初始化
for(int j=1;j<=m;j++){
if(pd[i][j]==true) anss++;
else {
if(anss>=k) t();
anss=0;
}
}
if(anss>=k) t();//特判最后一个位置是在行的末端
}
for(int i=1;i<=m;i++){
//模拟列
anss=0;
for(int j=1;j<=n;j++){
if(pd[j][i]==true) anss++;
else {
if(anss>=k) t();
anss=0;
}
}
if(anss>=k) t();//特判最后一个位置是在列的末端
}
if(k==1) cout<<all/2;//特判1
else cout<<all;
return 0;
}