A-清楚姐姐的糖葫芦(模拟)
题意:给定一个字符串,求字符o的个数
分析:模拟即可。
代码:
#include<bits/stdc++.h> using namespace std; int main(){ string s;cin>>s; int ans=0; for(int i=0;i<s.size();i++){ if(s[i]=='o')ans++; } cout<<ans<<endl; }
B-清楚姐姐买竹鼠(模拟)
题意:a元可以买1只老鼠,b元可以买3只老鼠,至少买x只老鼠需要多少元
分析:先算刚好买x只需要多少钱再算如果只买b元三只的情况
代码:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2e5 + 10; int main() { ll a, b, x; cin >> a >> b >> x; ll ans = (x / 3) * b + x % 3 * a; ans = min(ans, a * x); if(x%3!=0)ans = min(ans, (x / 3 + 1) * b); cout << ans << "\n"; return 0; }
C-竹鼠饲养物语
题意:有n袋饲料,饲料分为m个等级,每次吃相应的等级饲料,可以升级,不可以跳级,问最多可以进行几次有效投喂。
分析:用map记录饲料等级数量,每次饲料的等级是上一次饲料等级加一,每次将饲料等级变成两次饲料的最小值,并记录
代码:`
#include<bits/stdc++.h> using namespace std; typedef long long ll; int main(){ ll n,m;cin>>n>>m;ll ans=0;ll a[n+10]; for(int i=1;i<=n;i++)cin>>a[i]; sort(a+1,a+n+1); map<int,int>mp; for(int i=1;i<=n;i++){ mp[a[i]]++; } int c=0; for(auto &x:mp){ if(x.first==c+1){ if(c!=0) x.second=min(mp[c],x.second); } else break; ans+=x.second; c=x.first; } cout<<ans<<endl; }
D-清楚姐姐跳格子(bfs)
题意:有n个格子,刚开始在1,目标是第n个格子,每个格子上有数字ai,每次可以跳ai的正整数因子远,但是不可以跳出边界。问最少几步可以到达n号格子。
分析:用bfs寻找最少步数,用dis【i】记录走到i的最少步数
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll a[1010],dis[1010];ll n; vector<int>v; int bfs(int s,int e){ memset(dis,-1,sizeof(dis)); queue<int>pru; pru.push(s); dis[s]=0; while(!pru.empty()){ int x=pru.front(); pru.pop(); if(x==e)return dis[x]; for(int i=min(n,a[x]);i>=1;i--){ if(a[x]%i==0&&x+i<=n&&dis[x+i]==-1){ pru.push(x+i); dis[x+i]=dis[x]+1; } if(a[x]%i==0&&x-i>=1&&dis[x-i]==-1){ pru.push(x-i); dis[x-i]=dis[x]+1; } } //cout<<x<<" "<<dis[x]<<endl; } return -1; } int main(){ cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; cout<<bfs(1,n)<<endl; }
E-清楚姐姐的布告规划(dp)
题意:需要在长度为 n 个单位的布告板上张贴至多 n 张布告, 第 i 张布告的长度为 ai个单位, 如果选择第 i 张贴布告时需要满足: 1.第i 张布告必须要覆盖掉布告板的第i个位置 2.不能相互重叠但可以紧贴 求最少的粘贴布条数量
分析:使用动态规划遍历每个布条可以覆盖的位置进行更新 判断dp[n]是否被覆盖,若没有则输出-1
代码:
#include<bits/stdc++.h> using namespace std; int main(){ int t; cin>>t; while(t--){ int n; cin>>n; vector<int>a(n+1); for(int i=1;i<=n;i++){ cin>>a[i]; } vector<int>dp(n+10,1e9); dp[0]=0; for(int i=1;i<=n;i++){ for(int j=max(0,i-a[i]);j<i;j++){ if(j+a[i]<=n) dp[j+a[i]]=min(dp[j+a[i]],dp[j]+1); } } if(dp[n]==1e9)dp[n]=-1; cout<<dp[n]<<endl; } }