目录
「水」滔天巨浪【双指针】
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],n,ans;
int main(void)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
{
int j=i;
while(j+1<=n&&a[j+1]-a[j]==1) j++;
int len=j-i+1;
if(len==n) ans=max(ans,len-1);//说明总的一整段都是连续的
else ans=max(ans,len-2);
}
cout<<ans;
return 0;
}
「木」迷雾森林【DP】
#include<bits/stdc++.h>
using namespace std;
const int N=3010;
const int mod=2333;
int f[N][N],a[N][N],n,m;
int main(void)
{
memset(a,0x3f,sizeof a);
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) scanf("%d",&a[i][j]);
f[n][1]=1;
for(int i=n;i>=1;i--)
{
for(int j=1;j<=m;j++)
{
if(a[i+1][j]==0) f[i][j]=(f[i][j]+f[i+1][j])%mod;
if(a[i][j-1]==0) f[i][j]=(f[i][j]+f[i][j-1])%mod;
}
}
cout<<f[1][m]<<endl;
return 0;
}
「土」秘法地震【前缀和】
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int n,m,k,cnt,s[N][N];
string a[N];
int main(void)
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
for(int j=0;j<m;j++)
s[i][j+1]=a[i][j]-'0';
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
for(int i=1;i+k-1<=n;i++)
{
for(int j=1;j+k-1<=m;j++)
{
int x=i,y=j;
int xx=i+k-1,yy=j+k-1;
int sum=s[xx][yy]-s[x-1][yy]-s[xx][y-1]+s[x-1][y-1];
if(sum) cnt++;
}
}
cout<<cnt;
return 0;
}
「金」初心如金【思维】
「火」烈火燎原【思维】
「水」悠悠碧波【KMP】
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int ne[N],n;
int main(void)
{
string s; cin>>s;
n=s.size();
s="0"+s;
for(int i=2,j=0;i<=n;i++)
{
while(j&&s[i]!=s[j+1]) j=ne[j];
if(s[i]==s[j+1]) j++;
ne[i]=j;
}
set<int>st;
for(int i=1;i<n;i++) st.insert(ne[i]);//将其除最后一个,所有的前后缀保存
int step=ne[n];
while(step)
{
if(st.find(step)!=st.end())//如果找到了相等的前后缀的大小。
{
cout<<s.substr(1,step);
break;
}else step=ne[step];
}
return 0;
}
「金」点石成金【二进制枚举】
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=110;
LL a[N],b[N],c[N],d[N],n;
int main(void)
{
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i]>>b[i]>>c[i]>>d[i];
LL ans=0;
for(int i=0;i<(1<<n);i++)
{
LL sum1=0,sum2=0;
for(int j=0;j<n;j++)
{
if(i>>j&1)
{
sum1+=a[j];
sum2=max(sum2-b[j],0ll);
}
else
{
sum2+=c[j];
sum1=max(sum1-d[j],0ll);
}
}
ans=max(ans,sum1*sum2);
}
cout<<ans;
return 0;
}
「土」巨石滚滚【贪心】