牛客小白月赛92 题解
牛客小白月赛92 题解
A. 获得木头 签到
#include<bits/stdc++.h>
using namespace std;
#define ff first
#define ss second
#define pb push_back
#define all(u) u.begin(), u.end()
#define endl '\n'
#define debug(x) cout<<#x<<":"<<x<<endl;
typedef pair<int, int> PII;
typedef long long LL;
const int inf = 0x3f3f3f3f;
const int N = 1e5 + 10, M = 105;
const int mod = 1e9 + 7;
const int cases = 0;
void Showball(){
int x;
cin>>x;
cout<<x*8<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int T=1;
if(cases) cin>>T;
while(T--)
Showball();
return 0;
}
B.采矿时间到!签到
优先拿能够消耗1体力的矿石,接着拿与之前拿过的矿石相连的矿石,这样也消耗1体力,最后再拿剩下的矿石,消耗2体力。
void Showball(){
int n,h;
cin>>n>>h;
vector<string> s(5);
for(int i=0;i<5;i++) cin>>s[i];
int cnt=0,cnt2=0;
for(int i=0;i<n;i++){
if(s[0][i]=='*'){
if(s[1][i]=='*') cnt+=2;
else cnt2++;
}else if(s[1][i]=='*') cnt++;
if(s[4][i]=='*'){
if(s[3][i]=='*') cnt+=2;
else cnt2++;
}else if(s[3][i]=='*') cnt++;
}
int ans=min(h,cnt)+min(max(h-cnt,0)/2,cnt2);
cout<<ans<<endl;
}
C.耕种时间到!模拟
用
void Showball(){
int n;
cin>>n;
vector<PII> a(n);
for(int i=0;i<n;i++){
int x;
cin>>x;
a[i]={x,1};
}
int x;
cin>>x;
LL ans=0;
LL maxn=(*max_element(all(a))).ff;
while(maxn>=x){
LL tmp=0;
for(int i=0;i<n;i++){
if(a[i].ff==x) tmp+=a[i].ss;
}
for(int i=0;i<n;i++) a[i]={(a[i].ff+2)/3,a[i].ss*2};
maxn=(maxn+2)/3;
ans=max(ans,tmp);
}
cout<<ans<<endl;
}
D. 探索的时光 思维
题意:给你一个数组,请你找一个
思路:展开式子
原式
因为
原式
那么我们发现除了
可以通过对称轴求解,当然数据范围很小,也可以直接枚举求解即可。
void Showball(){
int n;
cin>>n;
LL a1=0,a2=0,a3=0;
for(int i=1;i<=n;i++){
LL x;
cin>>x;
a1+=x;
a2+=i*x;
a3+=1LL*i*i*x;
}
LL ans=1e18;
for(int i=1;i<=n;i++){
ans=min(ans,1LL*i*i*a1-2LL*i*a2+a3);
}
cout<<ans<<endl;
}
E. 来硬的 DP
题意:给你
其中
思路:不妨定义
考虑这个状态从哪个状态过来不容易,不妨考虑这个状态可以转移到哪个状态。
那么如果不使用魔法,显然
使用了魔法,显然
我们只需要考虑烧炼
void Showball(){
LL n,m;
cin>>n>>m;
vector<LL> x(n+1),y(n+1);
for(int i=1;i<=n;i++) cin>>x[i]>>y[i];
vector<vector<array<LL,2>>> f(n+1,vector<array<LL,2>>(m+1,{inf,inf}));
//f[i][j][0/1]表示考虑前i块煤炭烧炼j单位铁矿石 不使用/使用 魔法的 最短时间
f[0][0][0]=0;
for(int i=1;i<=n;i++){
for(int j=0;j<=m;j++){
f[i][j][0]=min(f[i][j][0],f[i-1][j][0]);
f[i][j][1]=min(f[i][j][1],f[i-1][j][1]);
f[i][min(m,j+x[i])][0]=min(f[i][min(m,j+x[i])][0],f[i-1][j][0]+y[i]);
f[i][min(m,j+x[i])][1]=min(f[i][min(m,j+x[i])][1],f[i-1][j][1]+y[i]);
f[i][min(m,j+2LL*x[i])][1]=min(f[i][min(m,j+2LL*x[i])][1],f[i-1][j][0]+y[i]/2);
}
}
LL ans=inf;
for(int i=1;i<=n;i++){
ans=min(ans,min(f[i][m][0],f[i][m][1]));
}
cout<<ans<<endl;
}
F. 快快乐乐剪羊毛 思维 差分
题意:给你
其中
思路:直接计算不容易,我们考虑去算每只羊对于草皮的贡献,我们不妨设草皮偏移量为
那么显然如果第
化简一下式子:
也就是说,只要偏移量符合这个区间,那么第
也就是对这个区间整体加上
考虑使用
代码非常好写,很好的思维题。
void Showball(){
int n,m;
cin>>n>>m;
vector<LL> w(n+1),v(n+1),x(m+1);
for(int i=1;i<=n;i++){
cin>>w[i];
w[i]+=w[i-1];
}
for(int i=1;i<=n;i++) cin>>v[i];
for(int i=1;i<=m;i++) cin>>x[i];
map<LL,vector<LL>> mp;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
mp[w[j-1]+1-x[i]].pb(v[j]);
mp[w[j]-x[i]+1].pb(-v[j]);
}
}
LL cur=0;
set<LL> st;
for(auto [k,v]: mp){
for(auto it:v) cur+=it;
st.insert(cur);
}
cout<<st.size()<<endl;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】