G - 数三角形(easy)
原题链接:G-数三角形(easy)_2024牛客寒假算法基础集训营4 (nowcoder.com)
知识点:枚举优化
题目描述:
思路:通过依次增加高来判断,首先判断三角形是否超出矩形范围,再判断三角形的腰是否存在,不存在跳出,存在判断三角形底边是否存在。在每一行将*编号,通过减法计算*的数量是否封住三角形的底边,即*的数量是否符合,符合计数+1.这个方法遍历每一个*计算总数。
代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
char a[555][555];
int b[555][555];
int n,m;
int cheak(int x,int y)
{
int mod=0;
for(int i=1;i<=n-x;i++)
{
if(y-i<1 || y+i>m)
return mod;
if(a[x+i][y-i]!='*'||a[x+i][y+i]!='*')
return mod;
if(b[x+i][y+i]-b[x+i][y-i]==2*i)
mod++;
}
return mod;
}
void solve()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int num=0;
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
if(a[i][j]=='*')
num++;
b[i][j]=num;
}
}
int sum=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]=='*')
sum+=cheak(i,j);
}
}
cout<<sum<<endl;
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int _;
_=1;
while(_--)
{
solve();
}
}
E- 漂亮数组
原题链接:E-漂亮数组_2024牛客寒假算法基础集训营4 (nowcoder.com)
知识点:贪心
题意:
思路:
从左往右依次遍历,计算前缀和,提前标记余数0,与k求余,标记每次的余数,若遇到已标记的余数,则计数+1,并清空前缀和以及标记过的余数 ,再标记0。重复到遍历完。
代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
void solve()
{
int n,k;
cin>>n>>k;
map<int , int>mp;
mp[0]=1;
int num=0,sum=0;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
sum+=x;
if(mp[sum%k]==1)
{
num++;
sum=0;
mp.clear();
mp[0]=1;
}
else
{
mp[sum%k]=1;
}
}
cout<<num<<endl;
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int _;
_=1;
while(_--)
{
solve();
}
}