img

牛客周赛 Round 2

A

思路:复制,暴力应该稳过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
string s,a;
int main ()
{
cin>>s>>a;
int n=s.size(),m=a.size();
s=s+s;
int ans=0;
for(int i=0;i<n;i++){
int cnt=0;
for(int j=0;j<m;j++){
if(s[i+j]==a[j])cnt++;
}
if(cnt==m) ans++;// 完全相同
}
cout<<ans<<endl;
return 0;
}

B

感觉dp

实际上确实是

如果不选,就是从dp[i-1]转移,否则就是选,条件是s[i]!=s[i-1]dp[i]=dp[i-2]+a[i]+a[i-1]

大致是这样,据说是打家劫舍的力扣

1
2
3
4
5
6
7
8
9
10
11
12
13
14
char s[N];
int f[N];
void solve(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
cin>>(s+1);
int ans=0;
for(int i=2;i<=n;i++){
f[i]=f[i-1];
if(s[i]!=s[i-1]) f[i]=max(f[i],f[i-2]+a[i]+a[i-1]);
}
cout<<f[n]<<endl;
return ;
}

打家劫舍代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
int rob(vector<int>& nums) {
if (nums.empty()) {
return 0;
}
int size = nums.size();
if (size == 1) {
return nums[0];
}
vector<int> dp = vector<int>(size, 0);
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);
for (int i = 2; i < size; i++) {
dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);
}
return dp[size - 1];
}
};

C

模拟题,深恶痛绝()

不妨记录高度

然后开始判断

耐心即可(确信)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
int a[N];
void solve()
{
cin>>n; int now;
for(int i=1;i<=n;i++){
int w,x; cin>>w>>x;
if(w==0){

now=max(a[x],a[x+1]);
a[x]=now+3;
a[x+1]=now+1;

}else if(w==90){

now=max({a[x]+1,a[x+1],a[x+2]});
a[x]=a[x+1]=a[x+2]=now+1;

}else if(w==180){

now=max(a[x],a[x+1]+2);// 考虑待来的作用
a[x]=a[x+1]=now+1;

}else{
now=max({a[x],a[x+1],a[x+2]});
a[x]=a[x+1]=now+1;
a[x+2]=now+2;
}

}
for(int i=1;i<=8;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return ;
}

D

分析一下,血量实际上只是打怪数量多少的求解罢了

只要能求出打死多少只怪需要多少血量

就可以做到直接Log查询

打怪直接打最少血量的

保证最优

剩下的问题只有:

打一只怪需要多长时间啊喂!

考虑4为一周期,会受到3次伤害

一些细节需要特判

比如这只怪取模4是不是可以一刀砍了

这只怪取模4为0是不是少受一点伤害

然后就直接排序加前缀和加二分查询啦阿sir

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void solve()
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
int a,b; cin>>a>>b;
int tim=a/4*3+(a%4<=2?0:1);
if(a%4==0) tim=a/4*3-1;
// 特别处理%4==0的考虑完整的杀了之后不会被砍
s[i]=tim*b;
}
sort(s+1,s+1+n);
for(int i=1;i<=n;i++){
s[i]+=s[i-1];
}

cin>>q;
while(q--){
int x; cin>>x;
x*=k;
x+=m;
int num=lower_bound(s+1,s+1+n,x)-s-1;
cout<<num<<" ";
}
cout<<endl;
return ;
}
img