| 题目 | 难度 | 知识点 |
|---|---|---|
| A 田忌赛马 | ★ | 签到 |
| B 正/邪 | ★ | 签到 |
| C 复读姬 | ★ | 签到 |
| D 收集金币 | ★★ | DP 递推 |
正常发挥,打完ABCD就下机了。误判wa了一发
田忌赛马
#include <bits/stdc++.h>
using namespace std;
int a[15],v[15];
int main()
{
cin>>v[0]>>v[1]>>v[2]>>a[0]>>a[1]>>a[2];
sort(v,v+3);
sort(a,a+3);
int cnt=0;
if(a[1]>v[0]&&a[2]>v[1]) puts("Yes");
else puts("No");
return 0;
}
正/邪
#include<bits/stdc++.h>
using namespace std;
int n;
string s;
int main(void)
{
cin>>n>>s;
int cnt=0;
for(int i=0;i<n;i++)
{
if(s[i]=='y') cnt++;
else{
int j=i;
while(j+1<n && s[j+1]==s[i]) j++;
int len=j-i+1;
cnt+=len/2;
i=j;
}
}
cout<<cnt;
return 0;
}
复读姬
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N],v[N];
string s[N];
int main()
{
int n; cin>>n;
for(int i=0;i<n;i++)
{
cin>>s[i];
}
vector< pair<string,int> >ve;
int ans=0;
for(int i=0;i<n;i++)
{
int j=i;
while(j+1<n&&s[j+1]==s[i]) j++;
int len=j-i+1;
i=j;
ve.push_back({s[i],len});
ans=max(ans,len);
}
for(int i=1;i<ve.size()-1;i++)
{
if(ve[i-1].first==ve[i+1].first&&ve[i].second==1)
{
ans=max(ans,ve[i-1].second+ve[i+1].second);
}
}
cout<<ans;
return 0;
}
用前后缀数组来存,l[i]就是以s[i]结尾的连续的s[i]的长度。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
string s[N];
int n,l[N],r[N];
int main(void)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>s[i];
l[1]=1;
for(int i=2;i<=n;i++)
{
if(s[i]==s[i-1]) l[i]=l[i-1]+1;
else l[i]=1;
}
r[n]=1;
for(int i=n-1;i>=1;i--)
{
if(s[i]==s[i+1]) r[i]=r[i+1]+1;
else r[i]=1;
}
int ans=0;
for(int i=1;i<=n;i++)
{
ans=max({ans,l[i]});
if(i-1>=1 && i+1<=n && s[i-1]==s[i+1]) ans=max(ans,l[i-1]+r[i+1]);
}
cout<<ans;
return 0;
}
收集金币
最终所有状态取一个max,因为有些是不能走的。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
int a[N][N],n,m,st[N][N],t;
int ans[N][N];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) cin>>a[i][j];
memset(st,0x3f,sizeof st);
cin>>t;
while(t--)
{
int x,y,v; cin>>x>>y>>v;
st[x][y]=v;
}
memset(ans,-1,sizeof ans);
ans[1][1]=a[1][1];
for(int i=2;i<=n;i++) {
if(st[1][i]>(i-1)) ans[1][i]=ans[1][i-1]+a[1][i];
else break;
}
for(int i=2;i<=n;i++){
if(st[i][1]>(i-1)) ans[i][1]=ans[i-1][1]+a[i][1];
else break;
}
for(int i=2;i<=n;i++)
{
for(int j=2;j<=m;j++)
{
if(st[i][j]>(i-1+j-1))
{
if(ans[i-1][j]!=-1) ans[i][j]=ans[i-1][j]+a[i][j];
if(ans[i][j-1]!=-1) ans[i][j]=max(ans[i][j-1]+a[i][j],ans[i][j]);
}
}
}
int cnt=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++){
cnt=max(cnt,ans[i][j]);
}
}
cout<<cnt;
return 0;
}