记错时间又没打,写了一下比较简单
A.小红的环形字符串
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
const int M = 1e9+7;
int a[N];
int b[N];
signed main(){
string s,str;
cin>>s>>str;
int ans=0;
int k=str.size();
for(int i=0;i<s.size();i++)
{
if(s[i]==str[0]){
int j=i;
int l=0;
while(s[j]==str[l]) {
j=(j+1)%(s.size());
l++;
}
if(l==k) ans++;
}
}
cout<<ans<<endl;
return 0;
}
B.相邻不同数字的标记
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
const int M = 1e9+7;
int a[N];
int f[N];
signed main(){
int n;
cin>>n;
string s;
for(int i=1;i<=n;i++){
cin>>a[i];
}
cin>>s;
for(int i=2,j=1;i<=n;i++,j++){
if(s[j]==s[j-1])
f[i]=f[i-1];
else{
f[i]=max(f[i-1],f[i-2]+a[i]+a[i-1]);
}
}
cout<<f[n]<<endl;
return 0;
}
C.小红的俄罗斯方块
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
const int M = 1e9+7;
int a[N]={0};
int f[N];
signed main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
int x,y;
cin>>x>>y;
if(x==0){
int k=max(a[y],a[y+1]);
a[y]=k+3;
a[y+1]=k+1;
}
else if(x==90){
int k=max(a[y]+1,max(a[y+1],a[y+2]));
for(int i=y;i<=y+2;i++)
a[i]=k+1;
}
else if(x==180){
int k=max(a[y],a[y+1]+2)+1;
for(int i=y;i<=y+1;i++)
a[i]=k;
}
else{
int k=max(a[y],max(a[y+1],a[y+2]));
a[y]=k+1;
a[y+1]=k+1;
a[y+2]=k+2;
}
}
for(int i=1;i<=8;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
D.小红打怪
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
const int M = 1e9+7;
int a[N]={0};
struct zz{
int x,y;
}f[N];
signed main(){
int n,h,k;
cin>>n>>h>>k;
for(int i=0;i<n;i++){
int x,y;
cin>>x>>y;
int xx=x/4;
int yy=x%4;
int tt=0;
if(yy==1||yy==2) tt=1;
else if(yy==3){
tt=2;
}
a[i]=(xx*3+tt-1)*y;
}
sort(a,a+n);
for(int i=1;i<n;i++){
a[i]+=a[i-1];
}
int q;
cin>>q;
for(int i=0;i<q;i++){
int x;
cin>>x;
int an=h+k*x;
int ke=0;
for(int j=0;j<n;j++){
if(an<=a[j]){
cout<<j<<" ";
ke=1;
break;
}
}
if(!ke) cout<<n<<" ";
}
return 0;
}