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; 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